From 12e62bdf7271c62996187f264066d64fa1c7acef Mon Sep 17 00:00:00 2001 From: Nightcycle <77173389+nightcycle@users.noreply.github.com> Date: Mon, 23 Oct 2023 09:49:31 -0400 Subject: [PATCH 01/57] Started planning --- .github/workflows/release.yml | 1 - README.md | 35 +- logo.png | Bin 57405 -> 0 bytes scripts/update-packages.sh | 2 +- selene.toml | 2 +- sourcemap.json | 2 +- src/BillboardFrame/demo.story.lua | 27 -- src/BillboardFrame/init.lua | 117 ------ src/BoardFrame/init.lua | 259 ------------- src/BoundingBoxFrame/init.lua | 137 ------- src/Bubble/demo.story.lua | 13 - src/Bubble/init.lua | 133 ------- src/Button/demo.story.lua | 28 -- src/Button/init.lua | 456 ----------------------- src/Checkbox/demo.story.lua | 39 -- src/Checkbox/init.lua | 209 ----------- src/EffectGui/demo.story.lua | 13 - src/EffectGui/init.lua | 193 ---------- src/Hint/demo.story.lua | 39 -- src/Hint/init.lua | 184 ---------- src/IconLabel/Spritesheet/Sheet1.lua | 506 ------------------------- src/IconLabel/Spritesheet/Sheet10.lua | 507 ------------------------- src/IconLabel/Spritesheet/Sheet11.lua | 503 ------------------------- src/IconLabel/Spritesheet/Sheet12.lua | 195 ---------- src/IconLabel/Spritesheet/Sheet2.lua | 502 ------------------------- src/IconLabel/Spritesheet/Sheet3.lua | 501 ------------------------- src/IconLabel/Spritesheet/Sheet4.lua | 502 ------------------------- src/IconLabel/Spritesheet/Sheet5.lua | 502 ------------------------- src/IconLabel/Spritesheet/Sheet6.lua | 502 ------------------------- src/IconLabel/Spritesheet/Sheet7.lua | 506 ------------------------- src/IconLabel/Spritesheet/Sheet8.lua | 507 ------------------------- src/IconLabel/Spritesheet/Sheet9.lua | 508 -------------------------- src/IconLabel/Spritesheet/init.lua | 7 - src/IconLabel/demo.story.lua | 21 -- src/IconLabel/init.lua | 147 -------- src/RadioButton/demo.story.lua | 39 -- src/RadioButton/init.lua | 217 ----------- src/Slider/demo.story.lua | 23 -- src/Slider/init.lua | 328 ----------------- src/SurfaceFrame/demo.story.lua | 29 -- src/SurfaceFrame/init.lua | 103 ------ src/Switch/demo.story.lua | 19 - src/Switch/init.lua | 248 ------------- src/Test/Source.cfusion.luau | 0 src/Test/init.luau | 12 + src/TextField/demo.story.lua | 27 -- src/TextField/init.lua | 504 ------------------------- src/TextLabel/demo.story.lua | 19 - src/TextLabel/init.lua | 180 --------- src/Types.lua | 224 ------------ src/Util.lua | 59 --- src/ViewportMountFrame/init.lua | 146 -------- src/init.lua | 149 +------- 53 files changed, 62 insertions(+), 10069 deletions(-) delete mode 100644 logo.png delete mode 100644 src/BillboardFrame/demo.story.lua delete mode 100644 src/BillboardFrame/init.lua delete mode 100644 src/BoardFrame/init.lua delete mode 100644 src/BoundingBoxFrame/init.lua delete mode 100644 src/Bubble/demo.story.lua delete mode 100644 src/Bubble/init.lua delete mode 100644 src/Button/demo.story.lua delete mode 100644 src/Button/init.lua delete mode 100644 src/Checkbox/demo.story.lua delete mode 100644 src/Checkbox/init.lua delete mode 100644 src/EffectGui/demo.story.lua delete mode 100644 src/EffectGui/init.lua delete mode 100644 src/Hint/demo.story.lua delete mode 100644 src/Hint/init.lua delete mode 100644 src/IconLabel/Spritesheet/Sheet1.lua delete mode 100644 src/IconLabel/Spritesheet/Sheet10.lua delete mode 100644 src/IconLabel/Spritesheet/Sheet11.lua delete mode 100644 src/IconLabel/Spritesheet/Sheet12.lua delete mode 100644 src/IconLabel/Spritesheet/Sheet2.lua delete mode 100644 src/IconLabel/Spritesheet/Sheet3.lua delete mode 100644 src/IconLabel/Spritesheet/Sheet4.lua delete mode 100644 src/IconLabel/Spritesheet/Sheet5.lua delete mode 100644 src/IconLabel/Spritesheet/Sheet6.lua delete mode 100644 src/IconLabel/Spritesheet/Sheet7.lua delete mode 100644 src/IconLabel/Spritesheet/Sheet8.lua delete mode 100644 src/IconLabel/Spritesheet/Sheet9.lua delete mode 100644 src/IconLabel/Spritesheet/init.lua delete mode 100644 src/IconLabel/demo.story.lua delete mode 100644 src/IconLabel/init.lua delete mode 100644 src/RadioButton/demo.story.lua delete mode 100644 src/RadioButton/init.lua delete mode 100644 src/Slider/demo.story.lua delete mode 100644 src/Slider/init.lua delete mode 100644 src/SurfaceFrame/demo.story.lua delete mode 100644 src/SurfaceFrame/init.lua delete mode 100644 src/Switch/demo.story.lua delete mode 100644 src/Switch/init.lua create mode 100644 src/Test/Source.cfusion.luau create mode 100644 src/Test/init.luau delete mode 100644 src/TextField/demo.story.lua delete mode 100644 src/TextField/init.lua delete mode 100644 src/TextLabel/demo.story.lua delete mode 100644 src/TextLabel/init.lua delete mode 100644 src/Types.lua delete mode 100644 src/Util.lua delete mode 100644 src/ViewportMountFrame/init.lua diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 834d0e3e..ed81156a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -84,7 +84,6 @@ jobs: fi curl -L "https://gist.github.com/nightcycle/a57e04de443dfa89bd08c8eb001b03c6/raw" > "lints/lua51.yml" curl -L "https://gist.github.com/nightcycle/93c4b9af5bbf4ed09f39aa908dffccd0/raw" > "lints/luau.yml" - curl -L "https://gist.github.com/nightcycle/e8c4a9a1d71cfd1a1fff59cad84156d1/raw" > "lints/roblox.yml" # apply code styling - name: style src scripts diff --git a/README.md b/README.md index a6a632e5..73775680 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,33 @@ -## Synthetic -Material UI inspired elements ported to Fusion! You can read all you need to know about Material UI design [here!](https://material.io/design) +# Synthetic +A UI component framework for Roblox Front-End development with the goal of compiling a robust library of professional grade components UI components with support for popular workflows in both its development and application. + +## Supported Frameworks +Currently the following frameworks are supported: +- (Vanilla): you don't need to use a framework at all +- (Fusion)[https://github.com/dphfox/Fusion]: Elttob's ecosystem shifting framework +- (Cold-Fusion)[https://github.com/nightcycle/cold-fusion]: My Fusion Wrapper written to support easier writing of common patterns & memory leak protection +- (Blend)[https://quenty.github.io/NevermoreEngine/api/Blend]: Quenty's Fusion inspired UI framework +- (Roact)[https://github.com/Roblox/roact]: Roblox's React inspired UI Framework + +## Design +Each component is designed to be lower level, with the goal of being a solid foundation with which you can confidently build UI interfaces. + +### Sizing +Components will attempt to aesthetically render as well as mimic under the following Roblox constructs: +- SizeConstraint: XX, XY, YY +- AutomaticSize: X, Y, XY, None +- Size: Pixel Offsets and Screen Dimension Scale on the X and Y axes +- Rotation: Degree based rotation + +### Color + + +### Typography +- AutomaticSize + +## Features + + +## Components + + diff --git a/logo.png b/logo.png deleted file mode 100644 index 615a8ac84cd0a4ff40e3859b3b884900fa77a09f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57405 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�jb%-RJB^8XR#max!KJ|ChSjTz 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 diff --git a/scripts/update-packages.sh b/scripts/update-packages.sh index be539c89..73319311 100644 --- a/scripts/update-packages.sh +++ b/scripts/update-packages.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -wally-update minor +wally-update major wally install rojo sourcemap dev.project.json --output sourcemap.json wally-package-types --sourcemap sourcemap.json Packages \ No newline at end of file diff --git a/selene.toml b/selene.toml index f1f90a1f..132fad72 100644 --- a/selene.toml +++ b/selene.toml @@ -1,4 +1,4 @@ -std = "lints/roblox" +std = "lints/luau+roblox" exclude = [ "out/*", "*.spec.lua", diff --git a/sourcemap.json b/sourcemap.json index 5c27e7ed..0b39328b 100644 --- a/sourcemap.json +++ b/sourcemap.json @@ -1 +1 @@ -{"name":"synthetic-test","className":"DataModel","filePaths":["dev.project.json"],"children":[{"name":"ReplicatedStorage","className":"ReplicatedStorage","children":[{"name":"Packages","className":"Folder","children":[{"name":"ColdFusion","className":"ModuleScript","filePaths":["Packages\\ColdFusion.lua"]},{"name":"Format","className":"ModuleScript","filePaths":["Packages\\Format.lua"]},{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\Maid.lua"]},{"name":"MeshUtil","className":"ModuleScript","filePaths":["Packages\\MeshUtil.lua"]},{"name":"Signal","className":"ModuleScript","filePaths":["Packages\\Signal.lua"]},{"name":"_Index","className":"Folder","children":[{"name":"nightcycle_cold-fusion@9.0.7","className":"Folder","children":[{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\Maid.lua"]},{"name":"ServiceProxy","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\ServiceProxy.lua"]},{"name":"Signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\Signal.lua"]},{"name":"TableUtil","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\TableUtil.lua"]},{"name":"cold-fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\init.luau","Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\default.project.json"],"children":[{"name":"Fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\init.lua"],"children":[{"name":"Animation","className":"Folder","children":[{"name":"Spring","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\Spring.lua"]},{"name":"SpringScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\SpringScheduler.lua"]},{"name":"Tween","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\Tween.lua"]},{"name":"TweenScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\TweenScheduler.lua"]},{"name":"getTweenRatio","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\getTweenRatio.lua"]},{"name":"lerpType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\lerpType.lua"]},{"name":"packType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\packType.lua"]},{"name":"springCoefficients","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\springCoefficients.lua"]},{"name":"unpackType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\unpackType.lua"]}]},{"name":"Colour","className":"Folder","children":[{"name":"Oklab","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Colour\\Oklab.lua"]}]},{"name":"Instances","className":"Folder","children":[{"name":"Attribute","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Attribute.lua"]},{"name":"AttributeChange","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\AttributeChange.lua"]},{"name":"AttributeOut","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\AttributeOut.lua"]},{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Children.lua"]},{"name":"Cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Cleanup.lua"]},{"name":"Hydrate","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Hydrate.lua"]},{"name":"New","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\New.lua"]},{"name":"OnChange","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\OnChange.lua"]},{"name":"OnEvent","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\OnEvent.lua"]},{"name":"Out","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Out.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Ref.lua"]},{"name":"applyInstanceProps","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\applyInstanceProps.lua"]},{"name":"defaultProps","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\defaultProps.lua"]}]},{"name":"Logging","className":"Folder","children":[{"name":"logError","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logError.lua"]},{"name":"logErrorNonFatal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logErrorNonFatal.lua"]},{"name":"logWarn","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logWarn.lua"]},{"name":"messages","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\messages.lua"]},{"name":"parseError","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\parseError.lua"]}]},{"name":"PubTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\PubTypes.lua"]},{"name":"State","className":"Folder","children":[{"name":"Computed","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Computed.lua"]},{"name":"ForKeys","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForKeys.lua"]},{"name":"ForPairs","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForPairs.lua"]},{"name":"ForValues","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForValues.lua"]},{"name":"Observer","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Observer.lua"]},{"name":"Value","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Value.lua"]},{"name":"isState","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\isState.lua"]},{"name":"makeUseCallback","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\makeUseCallback.lua"]},{"name":"peek","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\peek.lua"]},{"name":"updateAll","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\updateAll.lua"]}]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Types.lua"]},{"name":"Utility","className":"Folder","children":[{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\None.lua"]},{"name":"cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\cleanup.lua"]},{"name":"doNothing","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\doNothing.lua"]},{"name":"isSimilar","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\isSimilar.lua"]},{"name":"needsDestruction","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\needsDestruction.lua"]},{"name":"restrictRead","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\restrictRead.lua"]},{"name":"xtypeof","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\xtypeof.lua"]}]}]},{"name":"InstanceTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\InstanceTypes.luau"]},{"name":"Interface","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Interface.luau"]},{"name":"Test.story","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Test.story.luau"]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Types.luau"]},{"name":"Util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Util.luau"]}]}]},{"name":"nightcycle_format@0.1.3","className":"Folder","children":[{"name":"format","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\init.lua","Packages\\_Index\\nightcycle_format@0.1.3\\format\\default.project.json"],"children":[{"name":"Emoji","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\Emoji.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\init.spec.lua"]}]},{"name":"maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\maid.lua"]},{"name":"signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\signal.lua"]},{"name":"string","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\string.lua"]}]},{"name":"nightcycle_geometry-util@1.1.1","className":"Folder","children":[{"name":"geometry-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\init.lua","Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\default.project.json"],"children":[{"name":"Earcut","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\Earcut\\init.lua"],"children":[{"name":"ZeroArray","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\Earcut\\ZeroArray.lua"]}]}]}]},{"name":"nightcycle_maid@1.1.4","className":"Folder","children":[{"name":"maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\init.lua","Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\default.project.json"],"children":[{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\Maid.lua"]},{"name":"MaidTaskUtils","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\MaidTaskUtils.lua"]}]}]},{"name":"nightcycle_mesh-util@1.0.3","className":"Folder","children":[{"name":"GeometryUtil","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\GeometryUtil.lua"]},{"name":"mesh-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\init.lua","Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\default.project.json"],"children":[{"name":"CornerWedgePart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\CornerWedgePart.lua"]},{"name":"Part","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\Part.lua"]},{"name":"TetraPart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\TetraPart.lua"]},{"name":"WedgePart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\WedgePart.lua"]}]}]},{"name":"nightcycle_service-proxy@1.0.0","className":"Folder","children":[{"name":"service-proxy","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_service-proxy@1.0.0\\service-proxy\\src\\init.lua","Packages\\_Index\\nightcycle_service-proxy@1.0.0\\service-proxy\\default.project.json"]}]},{"name":"nightcycle_signal@1.0.2","className":"Folder","children":[{"name":"signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_signal@1.0.2\\signal\\src\\init.lua","Packages\\_Index\\nightcycle_signal@1.0.2\\signal\\default.project.json"]}]},{"name":"nightcycle_string@0.1.0","className":"Folder","children":[{"name":"string","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_string@0.1.0\\string\\src\\init.lua","Packages\\_Index\\nightcycle_string@0.1.0\\string\\default.project.json"],"children":[{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_string@0.1.0\\string\\src\\init.spec.lua"]}]}]},{"name":"nightcycle_table-util@1.1.0","className":"Folder","children":[{"name":"table-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_table-util@1.1.0\\table-util\\src\\init.lua","Packages\\_Index\\nightcycle_table-util@1.1.0\\table-util\\default.project.json"]}]}]},{"name":"synthetic","className":"ModuleScript","filePaths":["src\\init.lua"],"children":[{"name":"BillboardFrame","className":"ModuleScript","filePaths":["src\\BillboardFrame\\init.lua"],"children":[{"name":"demo.story","className":"ModuleScript","filePaths":["src\\BillboardFrame\\demo.story.lua"]}]},{"name":"BoardFrame","className":"ModuleScript","filePaths":["src\\BoardFrame\\init.lua"]},{"name":"BoundingBoxFrame","className":"ModuleScript","filePaths":["src\\BoundingBoxFrame\\init.lua"]},{"name":"Bubble","className":"ModuleScript","filePaths":["src\\Bubble\\init.lua"],"children":[{"name":"demo.story","className":"ModuleScript","filePaths":["src\\Bubble\\demo.story.lua"]}]},{"name":"Button","className":"ModuleScript","filePaths":["src\\Button\\init.lua"],"children":[{"name":"demo.story","className":"ModuleScript","filePaths":["src\\Button\\demo.story.lua"]}]},{"name":"Checkbox","className":"ModuleScript","filePaths":["src\\Checkbox\\init.lua"],"children":[{"name":"demo.story","className":"ModuleScript","filePaths":["src\\Checkbox\\demo.story.lua"]}]},{"name":"EffectGui","className":"ModuleScript","filePaths":["src\\EffectGui\\init.lua"],"children":[{"name":"demo.story","className":"ModuleScript","filePaths":["src\\EffectGui\\demo.story.lua"]}]},{"name":"Hint","className":"ModuleScript","filePaths":["src\\Hint\\init.lua"],"children":[{"name":"demo.story","className":"ModuleScript","filePaths":["src\\Hint\\demo.story.lua"]}]},{"name":"IconLabel","className":"ModuleScript","filePaths":["src\\IconLabel\\init.lua"],"children":[{"name":"Spritesheet","className":"ModuleScript","filePaths":["src\\IconLabel\\Spritesheet\\init.lua"],"children":[{"name":"Sheet1","className":"ModuleScript","filePaths":["src\\IconLabel\\Spritesheet\\Sheet1.lua"]},{"name":"Sheet10","className":"ModuleScript","filePaths":["src\\IconLabel\\Spritesheet\\Sheet10.lua"]},{"name":"Sheet11","className":"ModuleScript","filePaths":["src\\IconLabel\\Spritesheet\\Sheet11.lua"]},{"name":"Sheet12","className":"ModuleScript","filePaths":["src\\IconLabel\\Spritesheet\\Sheet12.lua"]},{"name":"Sheet2","className":"ModuleScript","filePaths":["src\\IconLabel\\Spritesheet\\Sheet2.lua"]},{"name":"Sheet3","className":"ModuleScript","filePaths":["src\\IconLabel\\Spritesheet\\Sheet3.lua"]},{"name":"Sheet4","className":"ModuleScript","filePaths":["src\\IconLabel\\Spritesheet\\Sheet4.lua"]},{"name":"Sheet5","className":"ModuleScript","filePaths":["src\\IconLabel\\Spritesheet\\Sheet5.lua"]},{"name":"Sheet6","className":"ModuleScript","filePaths":["src\\IconLabel\\Spritesheet\\Sheet6.lua"]},{"name":"Sheet7","className":"ModuleScript","filePaths":["src\\IconLabel\\Spritesheet\\Sheet7.lua"]},{"name":"Sheet8","className":"ModuleScript","filePaths":["src\\IconLabel\\Spritesheet\\Sheet8.lua"]},{"name":"Sheet9","className":"ModuleScript","filePaths":["src\\IconLabel\\Spritesheet\\Sheet9.lua"]}]},{"name":"demo.story","className":"ModuleScript","filePaths":["src\\IconLabel\\demo.story.lua"]}]},{"name":"RadioButton","className":"ModuleScript","filePaths":["src\\RadioButton\\init.lua"],"children":[{"name":"demo.story","className":"ModuleScript","filePaths":["src\\RadioButton\\demo.story.lua"]}]},{"name":"Slider","className":"ModuleScript","filePaths":["src\\Slider\\init.lua"],"children":[{"name":"demo.story","className":"ModuleScript","filePaths":["src\\Slider\\demo.story.lua"]}]},{"name":"SurfaceFrame","className":"ModuleScript","filePaths":["src\\SurfaceFrame\\init.lua"],"children":[{"name":"demo.story","className":"ModuleScript","filePaths":["src\\SurfaceFrame\\demo.story.lua"]}]},{"name":"Switch","className":"ModuleScript","filePaths":["src\\Switch\\init.lua"],"children":[{"name":"demo.story","className":"ModuleScript","filePaths":["src\\Switch\\demo.story.lua"]}]},{"name":"TextField","className":"ModuleScript","filePaths":["src\\TextField\\init.lua"],"children":[{"name":"demo.story","className":"ModuleScript","filePaths":["src\\TextField\\demo.story.lua"]}]},{"name":"TextLabel","className":"ModuleScript","filePaths":["src\\TextLabel\\init.lua"],"children":[{"name":"demo.story","className":"ModuleScript","filePaths":["src\\TextLabel\\demo.story.lua"]}]},{"name":"Types","className":"ModuleScript","filePaths":["src\\Types.lua"]},{"name":"Util","className":"ModuleScript","filePaths":["src\\Util.lua"]},{"name":"ViewportMountFrame","className":"ModuleScript","filePaths":["src\\ViewportMountFrame\\init.lua"]}]}]}]}]} \ No newline at end of file +{"name":"synthetic-test","className":"DataModel","filePaths":["dev.project.json"],"children":[{"name":"ReplicatedStorage","className":"ReplicatedStorage","children":[{"name":"Packages","className":"Folder","children":[{"name":"ColdFusion","className":"ModuleScript","filePaths":["Packages\\ColdFusion.lua"]},{"name":"Format","className":"ModuleScript","filePaths":["Packages\\Format.lua"]},{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\Maid.lua"]},{"name":"MeshUtil","className":"ModuleScript","filePaths":["Packages\\MeshUtil.lua"]},{"name":"Signal","className":"ModuleScript","filePaths":["Packages\\Signal.lua"]},{"name":"_Index","className":"Folder","children":[{"name":"nightcycle_cold-fusion@9.0.7","className":"Folder","children":[{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\Maid.lua"]},{"name":"ServiceProxy","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\ServiceProxy.lua"]},{"name":"Signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\Signal.lua"]},{"name":"TableUtil","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\TableUtil.lua"]},{"name":"cold-fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\init.luau","Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\default.project.json"],"children":[{"name":"Fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\init.lua"],"children":[{"name":"Animation","className":"Folder","children":[{"name":"Spring","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\Spring.lua"]},{"name":"SpringScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\SpringScheduler.lua"]},{"name":"Tween","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\Tween.lua"]},{"name":"TweenScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\TweenScheduler.lua"]},{"name":"getTweenRatio","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\getTweenRatio.lua"]},{"name":"lerpType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\lerpType.lua"]},{"name":"packType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\packType.lua"]},{"name":"springCoefficients","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\springCoefficients.lua"]},{"name":"unpackType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\unpackType.lua"]}]},{"name":"Colour","className":"Folder","children":[{"name":"Oklab","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Colour\\Oklab.lua"]}]},{"name":"Instances","className":"Folder","children":[{"name":"Attribute","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Attribute.lua"]},{"name":"AttributeChange","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\AttributeChange.lua"]},{"name":"AttributeOut","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\AttributeOut.lua"]},{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Children.lua"]},{"name":"Cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Cleanup.lua"]},{"name":"Hydrate","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Hydrate.lua"]},{"name":"New","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\New.lua"]},{"name":"OnChange","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\OnChange.lua"]},{"name":"OnEvent","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\OnEvent.lua"]},{"name":"Out","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Out.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Ref.lua"]},{"name":"applyInstanceProps","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\applyInstanceProps.lua"]},{"name":"defaultProps","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\defaultProps.lua"]}]},{"name":"Logging","className":"Folder","children":[{"name":"logError","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logError.lua"]},{"name":"logErrorNonFatal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logErrorNonFatal.lua"]},{"name":"logWarn","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logWarn.lua"]},{"name":"messages","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\messages.lua"]},{"name":"parseError","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\parseError.lua"]}]},{"name":"PubTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\PubTypes.lua"]},{"name":"State","className":"Folder","children":[{"name":"Computed","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Computed.lua"]},{"name":"ForKeys","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForKeys.lua"]},{"name":"ForPairs","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForPairs.lua"]},{"name":"ForValues","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForValues.lua"]},{"name":"Observer","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Observer.lua"]},{"name":"Value","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Value.lua"]},{"name":"isState","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\isState.lua"]},{"name":"makeUseCallback","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\makeUseCallback.lua"]},{"name":"peek","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\peek.lua"]},{"name":"updateAll","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\updateAll.lua"]}]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Types.lua"]},{"name":"Utility","className":"Folder","children":[{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\None.lua"]},{"name":"cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\cleanup.lua"]},{"name":"doNothing","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\doNothing.lua"]},{"name":"isSimilar","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\isSimilar.lua"]},{"name":"needsDestruction","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\needsDestruction.lua"]},{"name":"restrictRead","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\restrictRead.lua"]},{"name":"xtypeof","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\xtypeof.lua"]}]}]},{"name":"InstanceTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\InstanceTypes.luau"]},{"name":"Interface","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Interface.luau"]},{"name":"Test.story","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Test.story.luau"]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Types.luau"]},{"name":"Util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Util.luau"]}]}]},{"name":"nightcycle_format@0.1.3","className":"Folder","children":[{"name":"format","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\init.lua","Packages\\_Index\\nightcycle_format@0.1.3\\format\\default.project.json"],"children":[{"name":"Emoji","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\Emoji.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\init.spec.lua"]}]},{"name":"maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\maid.lua"]},{"name":"signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\signal.lua"]},{"name":"string","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\string.lua"]}]},{"name":"nightcycle_geometry-util@1.1.1","className":"Folder","children":[{"name":"geometry-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\init.lua","Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\default.project.json"],"children":[{"name":"Earcut","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\Earcut\\init.lua"],"children":[{"name":"ZeroArray","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\Earcut\\ZeroArray.lua"]}]}]}]},{"name":"nightcycle_maid@1.1.4","className":"Folder","children":[{"name":"maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\init.lua","Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\default.project.json"],"children":[{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\Maid.lua"]},{"name":"MaidTaskUtils","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\MaidTaskUtils.lua"]}]}]},{"name":"nightcycle_mesh-util@1.0.3","className":"Folder","children":[{"name":"GeometryUtil","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\GeometryUtil.lua"]},{"name":"mesh-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\init.lua","Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\default.project.json"],"children":[{"name":"CornerWedgePart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\CornerWedgePart.lua"]},{"name":"Part","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\Part.lua"]},{"name":"TetraPart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\TetraPart.lua"]},{"name":"WedgePart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\WedgePart.lua"]}]}]},{"name":"nightcycle_service-proxy@1.0.0","className":"Folder","children":[{"name":"service-proxy","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_service-proxy@1.0.0\\service-proxy\\src\\init.lua","Packages\\_Index\\nightcycle_service-proxy@1.0.0\\service-proxy\\default.project.json"]}]},{"name":"nightcycle_signal@1.0.2","className":"Folder","children":[{"name":"signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_signal@1.0.2\\signal\\src\\init.lua","Packages\\_Index\\nightcycle_signal@1.0.2\\signal\\default.project.json"]}]},{"name":"nightcycle_string@0.1.0","className":"Folder","children":[{"name":"string","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_string@0.1.0\\string\\src\\init.lua","Packages\\_Index\\nightcycle_string@0.1.0\\string\\default.project.json"],"children":[{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_string@0.1.0\\string\\src\\init.spec.lua"]}]}]},{"name":"nightcycle_table-util@1.1.0","className":"Folder","children":[{"name":"table-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_table-util@1.1.0\\table-util\\src\\init.lua","Packages\\_Index\\nightcycle_table-util@1.1.0\\table-util\\default.project.json"]}]}]},{"name":"synthetic","className":"ModuleScript","filePaths":["src\\init.lua"]}]}]}]} \ No newline at end of file diff --git a/src/BillboardFrame/demo.story.lua b/src/BillboardFrame/demo.story.lua deleted file mode 100644 index 35d762f2..00000000 --- a/src/BillboardFrame/demo.story.lua +++ /dev/null @@ -1,27 +0,0 @@ ---!strict -local ComponentModule = script.Parent -assert(ComponentModule) -local Package = ComponentModule.Parent -assert(Package) -local Packages = Package.Parent -assert(Packages) -local Maid = require(Packages:WaitForChild("Maid")) - -return function(coreGui) - local Maid = Maid.new() - local module = require(script.Parent) - - local demo: module.BillboardFrameParameters = { - BackgroundColor3 = Color3.fromHSV(0.75, 1, 1), - Position = Vector3.new(0, 10, 0), - AnchorPoint = Vector2.new(0.5, 0.5), - Parent = coreGui, - } :: any - - local frame = module()(demo) - - Maid:GiveTask(frame) - return function() - Maid:Destroy() - end -end diff --git a/src/BillboardFrame/init.lua b/src/BillboardFrame/init.lua deleted file mode 100644 index 5e2b9b6b..00000000 --- a/src/BillboardFrame/init.lua +++ /dev/null @@ -1,117 +0,0 @@ ---!strict -local Package = script.Parent -assert(Package) -local Packages = Package.Parent -assert(Packages) - -local Types = require(Package:WaitForChild("Types")) - -local ColdFusion = require(Packages:WaitForChild("ColdFusion")) -type Fuse = ColdFusion.Fuse -type State = ColdFusion.State -type ValueState = ColdFusion.ValueState -type CanBeState = ColdFusion.CanBeState - -local Maid = require(Packages:WaitForChild("Maid")) -type Maid = Maid.Maid - -export type BillboardFrameParameters = Types.FrameParameters & { - Parent: CanBeState?, - Position: CanBeState?, - Size: CanBeState?, - LightInfluence: CanBeState?, - Active: CanBeState?, - AlwaysOnTop: CanBeState?, - MaxDistance: CanBeState?, - AnchorPoint: CanBeState?, -} - -export type BillboardFrame = Frame - -function Constructor(config: BillboardFrameParameters): BillboardFrame - -- init workspace - local maid = Maid.new() - local _fuse = ColdFusion.fuse(maid) - local _new = _fuse.new - local _bind = _fuse.bind - local _import = _fuse.import - local _Value = _fuse.Value - local _Computed = _fuse.Computed - - -- unload config states - local Parent: State = _import(config.Parent, nil :: Instance?) :: any - local Position = _import(config.Position :: any, Vector3.new(0, 0, 0)) :: State - local Size: State = _import(config.Size :: any, Vector2.new(0, 0)) :: any - local LightInfluence = _import(config.LightInfluence, 0) - local AlwaysOnTop = _import(config.AlwaysOnTop, false) - local MaxDistance = _import(config.MaxDistance, 100) - local Active = _import(config.Active, true) - local AnchorPoint = _import(config.AnchorPoint, Vector2.new(0.5, 0.5)) - - -- constructing instances - - local SurfaceGui: BillboardGui = _new("BillboardGui")({ - Parent = Parent, - Active = Active, - AlwaysOnTop = AlwaysOnTop, - Size = _Computed(function(size: Vector2) - return UDim2.fromScale(size.X, size.Y) - end, Size), - ClipsDescendants = false, - LightInfluence = LightInfluence, - MaxDistance = MaxDistance, - }) :: any - - local Part = _new("Part")({ - -- Properties = { - Parent = workspace, - Position = Position, - Transparency = 1, - Size = Vector3.new(1, 1, 1) * 0.05, - Anchored = true, - CanCollide = false, - CanTouch = false, - CanQuery = false, - -- }, - }) - - SurfaceGui.Adornee = Part - - -- assemble final parameters - local parameters: any = { - Parent = SurfaceGui, - Position = UDim2.fromScale(0.5, 0.5), - Size = UDim2.fromScale(1, 1), - AnchorPoint = AnchorPoint, - } - - config.Size = nil - config.LightInfluence = nil - config.AlwaysOnTop = nil - config.MaxDistance = nil - - for k, v in pairs(config) do - if parameters[k] == nil then - parameters[k] = v - end - end - - -- construct output instance - local Output: Frame = _new("Frame")(parameters) :: any - - maid:GiveTask(Output.Destroying:Connect(function() - maid:Destroy() - end)) - - return Output -end - -return function(maid: Maid?) - return function(params: BillboardFrameParameters): BillboardFrame - local inst = Constructor(params) - if maid then - maid:GiveTask(inst) - end - return inst - end -end diff --git a/src/BoardFrame/init.lua b/src/BoardFrame/init.lua deleted file mode 100644 index e8b7acf2..00000000 --- a/src/BoardFrame/init.lua +++ /dev/null @@ -1,259 +0,0 @@ ---!strict -local RunService = game:GetService("RunService") -local UserInputService = game:GetService("UserInputService") -local Package = script.Parent -assert(Package) -local Packages = Package.Parent -assert(Packages) - -local Util = require(Package:WaitForChild("Util")) - -local Types = require(Package:WaitForChild("Types")) - -local ColdFusion = require(Packages:WaitForChild("ColdFusion")) -type Fuse = ColdFusion.Fuse -type State = ColdFusion.State -type ValueState = ColdFusion.ValueState -type CanBeState = ColdFusion.CanBeState - -local Maid = require(Packages:WaitForChild("Maid")) -type Maid = Maid.Maid - -export type BoardFrameParameters = Types.ViewportFrameParameters & { - -- Color: CanBeState?, - PixelsPerStud: CanBeState?, - CanvasPosition: CanBeState?, - CanvasTransparency: CanBeState?, - CanvasColor: CanBeState?, - CanvasMaterial: CanBeState?, - CanvasMaterialVariant: CanBeState?, - LockPosition: CanBeState?, - LockZoom: CanBeState?, - Zoom: CanBeState?, - MinZoom: CanBeState?, - MaxZoom: CanBeState?, - ZoomSpeed: CanBeState?, - CameraHeight: CanBeState?, -} - -export type BoardFrame = ViewportFrame - -function Constructor(config: BoardFrameParameters): BoardFrame - -- init workspace - local maid = Maid.new() - local _fuse = ColdFusion.fuse(maid) - local _new = _fuse.new - local _bind = _fuse.bind - local _import = _fuse.import - local _Value = _fuse.Value - local _Computed = _fuse.Computed - - -- unload config states - local Size = _import(config.Size, UDim2.fromScale(1, 1)) - local Position = _import(config.Position, UDim2.fromScale(0.5, 0.5)) - local AnchorPoint = _import(config.AnchorPoint, Vector2.new(0.5, 0.5)) - local PixelsPerStud = _import(config.PixelsPerStud, 20) - local CanvasPosition = - _Value(if typeof(config.CanvasPosition) == "Vector2" then config.CanvasPosition elseif typeof(config.CanvasPosition) == "table" then config.CanvasPosition:Get() else Vector2.new(0, 0)) - local CanvasTransparency = _import(config.CanvasTransparency, 0) - local CanvasColor = _import(config.CanvasColor, Color3.new(1, 1, 1)) - local CanvasMaterial = _import(config.CanvasMaterial, "SmoothPlastic") - local CanvasMaterialVariant = _import(config.CanvasMaterialVariant, "") - local LockPosition = _import(config.LockPosition, false) - local LockZoom = _import(config.LockZoom, false) - local MinZoom = _import(config.MinZoom, 1) - local MaxZoom = _import(config.MaxZoom, 10) - local ZoomSpeed = _import(config.ZoomSpeed, 4) - local CameraHeight = _import(config.CameraHeight, 100) - - -- init internal states - local Zoom = _Value(if typeof(config.Zoom) == "number" then config.Zoom elseif typeof(config.Zoom) == "table" then config.Zoom:Get() else 1) - local Delta = _Value(1 / 60) - local AbsoluteSize = _Value(Vector2.new(0, 0)) - local CanvasSize = _Computed(function(absSize: Vector2, pxRatio: number) - return absSize / pxRatio - end, AbsoluteSize, PixelsPerStud) --_import(config.CanvasSize, Vector2.new(60,40)) - local SizeRatio = _Computed(function(absSize: Vector2) - return absSize.X / absSize.Y - end, AbsoluteSize) - local CameraFieldOfView = _Computed(function(zoom: number, canvasSize: Vector2, z: number) - local y = canvasSize.Y - local goalY = y / zoom - local angle = math.atan2(goalY * 0.5, z) * 2 - return math.deg(angle) - end, Zoom, CanvasSize, CameraHeight) - local CameraWindowSize = _Computed(function(height: number, fov: number, ratio: number) - local y = 2 * math.tan(math.rad(fov * 0.5)) * height - local x = y * ratio - return Vector2.new(math.abs(x), math.abs(y)) - end, CameraHeight, CameraFieldOfView, SizeRatio) - local AbsoluteCanvasPosition = _Computed(function(pos: Vector2, winSize: Vector2, canSize: Vector2) - local min = pos - winSize / 2 - local max = pos + winSize / 2 - - local x = pos.X - local y = pos.Y - - local canMin = -canSize / 2 - local canMax = canSize / 2 - - if min.X < canMin.X and max.X > canMax.X then - x = 0 - else - if min.X < canMin.X then - x += canMin.X - min.X - end - if max.X > canMax.X then - x -= max.X - canMax.X - end - end - - if min.Y < canMin.Y and max.Y > canMax.Y then - y = 0 - else - if min.Y < canMin.Y then - y += canMin.Y - min.Y - end - if max.Y > canMax.Y then - y -= max.Y - canMax.Y - end - end - return Vector2.new(x, y) - end, CanvasPosition, CameraWindowSize, CanvasSize) - local CameraCFrame = _Computed(function(canvasPos: Vector2, height: number, fov: number) - local pos = Vector3.new(canvasPos.X, canvasPos.Y, height) - return CFrame.new(pos, Vector3.new(canvasPos.X, canvasPos.Y, 0)) - end, AbsoluteCanvasPosition, CameraHeight, CameraFieldOfView) - - -- constructing instances - local Camera = _fuse.new("Camera")({ - CFrame = CameraCFrame, - FieldOfView = CameraFieldOfView, - }) - local WorldModel: any = _fuse.new("WorldModel")({ - Name = "Canvas", - }) - - -- assemble final parameters - local parameters: any = { - Parent = _import(config.Parent, nil), - Name = _import(config.Name, script.Name), - ClipsDescendants = true, - Size = Size, - Position = Position, - AnchorPoint = AnchorPoint, - Transparency = 1, - CurrentCamera = Camera, - Children = { - WorldModel, - Camera, - }, - } - - config.PixelsPerStud = nil - config.CanvasPosition = nil - config.CanvasTransparency = nil - config.CanvasColor = nil - config.CanvasMaterial = nil - config.CanvasMaterialVariant = nil - config.LockPosition = nil - config.LockZoom = nil - config.Zoom = nil - config.MinZoom = nil - config.MaxZoom = nil - config.ZoomSpeed = nil - config.CameraHeight = nil - - for k, v in pairs(config) do - if parameters[k] == nil then - parameters[k] = v - end - end - - -- construct output instance - local Output: ViewportFrame = _fuse.new("ViewportFrame")(parameters) :: any - Util.cleanUpPrep(maid, Output) - - local _Canvas = _fuse.new("Part")({ - Name = "CanvasPart", - Shape = Enum.PartType.Block, - Parent = WorldModel, - Material = _Computed(function(matName: string): Enum.Material - local enum: any = Enum.Material - return enum[matName] - end, CanvasMaterial), - MaterialVariant = CanvasMaterialVariant, - Transparency = CanvasTransparency, - Color = CanvasColor, - ["CFrame"] = CFrame.new(Vector3.new(0, 0, -1), Vector3.new(0, 0, 1)), - Size = _Computed(function(size: Vector2) - return Vector3.new(size.X, size.Y, 0.01) - end, CanvasSize), - }) - local PreviousMousePosition = _Value(Vector2.new(0, 0)) - local MousePosition = _Value(Vector2.new(0, 0)) - local MouseDelta = _Computed(function(mPos: Vector2, pMPos: Vector2) - return pMPos - mPos - end, MousePosition, PreviousMousePosition) - - local IsHovering = _Computed(function(mPos: Vector2) - local sGui = Output:FindFirstAncestorWhichIsA("BasePlayerGui") - if not sGui then - return false - end - assert(sGui ~= nil) - local guis = sGui:GetGuiObjectsAtPosition(mPos.X, mPos.Y) - for i, gui in ipairs(guis) do - if gui == Output then - return true - end - end - return false - end, MousePosition) - - maid:GiveTask(UserInputService.PointerAction:Connect(function(wheel: number, pan: Vector2, pinch: number) - if not LockZoom:Get() and IsHovering:Get() then - local currentZoom = Zoom:Get() - local zoomSpeed = ZoomSpeed:Get() - local delta = Delta:Get() - local alpha = (wheel + pinch) - - zoomSpeed *= alpha - - local goal = currentZoom * (1 + zoomSpeed) - -- print("Goal", goal, "Alpha", alpha, "Speed", zoomSpeed) - local newZoom = currentZoom + delta * (goal - currentZoom) - Zoom:Set(math.clamp(newZoom, MinZoom:Get(), MaxZoom:Get())) - end - end)) - - maid:GiveTask(RunService.RenderStepped:Connect(function(delta) - Delta:Set(delta) - AbsoluteSize:Set(Output.AbsoluteSize) - PreviousMousePosition:Set(MousePosition:Get()) - MousePosition:Set(UserInputService:GetMouseLocation()) - if IsHovering:Get() and UserInputService:IsMouseButtonPressed(Enum.UserInputType.MouseButton1) and not LockPosition:Get() then - local mouseDelta = MouseDelta:Get() --UserInputService:GetMouseDelta() - -- print("Dragging", mouseDelta) - local cameraWindowSize = CameraWindowSize:Get() - local vportSize = AbsoluteSize:Get() - local mouseOffset = mouseDelta * Vector2.new(1, -1) - local worldOffset = cameraWindowSize * mouseOffset / vportSize - -- local delta = Delta:Get() - -- print("World", worldOffset, "Mouse", mouseScaleOffset, "Pos", mousePos) - CanvasPosition:Set(AbsoluteCanvasPosition:Get() + worldOffset) - end - end)) - - return Output -end - -return function(maid: Maid?) - return function(params: BoardFrameParameters): BoardFrame - local inst = Constructor(params) - if maid then - maid:GiveTask(inst) - end - return inst - end -end diff --git a/src/BoundingBoxFrame/init.lua b/src/BoundingBoxFrame/init.lua deleted file mode 100644 index 84c5fdf0..00000000 --- a/src/BoundingBoxFrame/init.lua +++ /dev/null @@ -1,137 +0,0 @@ ---!strict - -local RunService = game:GetService("RunService") - -local Package = script.Parent -assert(Package) -local Packages = Package.Parent -assert(Packages) - -local MeshUtil = require(Packages:WaitForChild("MeshUtil")) - -local Util = require(Package:WaitForChild("Util")) - -local ColdFusion = require(Packages:WaitForChild("ColdFusion")) -type Fuse = ColdFusion.Fuse -type State = ColdFusion.State -type ValueState = ColdFusion.ValueState -type CanBeState = ColdFusion.CanBeState - -local Maid = require(Packages:WaitForChild("Maid")) -type Maid = Maid.Maid - -local MountFrame = require(Package:WaitForChild("ViewportMountFrame")) - -export type BoundingBoxFrameParameters = MountFrame.ViewportMountFrameParameters & { - Target: CanBeState?, -} - -export type BoundingBoxFrame = Frame - -function Constructor(config: BoundingBoxFrameParameters): BoundingBoxFrame - -- init workspace - local maid = Maid.new() - local _fuse = ColdFusion.fuse(maid) - local _new = _fuse.new - local _bind = _fuse.bind - local _import = _fuse.import - local _Value = _fuse.Value - local _Computed = _fuse.Computed - - -- unload config states - local Parent = _import(config.Parent, nil) - - -- init internal states - local Target: State = _Value(nil :: Instance?) - local TargetCFrame: ValueState = _Value(nil :: CFrame?) - local TargetSize: ValueState = _Value(nil :: Vector2?) - local BoardFrame: ValueState = _Value(nil :: ViewportFrame?) - local Camera: ValueState = _Value(nil :: Camera?) - maid:GiveTask(BoardFrame:Connect(function(cur: ViewportFrame?) - Camera:Set(nil) - if not cur then - return - end - assert(cur ~= nil) - maid._billboardCameraCheck = cur:GetPropertyChangedSignal("CurrentCamera"):Connect(function() - Camera:Set(cur.CurrentCamera) - end) - Camera:Set(cur.CurrentCamera) - end)) - - -- update states each frame - maid:GiveTask(RunService.Heartbeat:Connect(function(dt) - local target = Target:Get() - local cam = Camera:Get() - if not target or not cam then - return - end - assert(target ~= nil and cam ~= nil) - local camCF = cam.CFrame - - local parts = {} - if target:IsA("Model") or target:IsA("Folder") then - for i, part in ipairs(target:GetDescendants()) do - if part:IsA("BasePart") then - table.insert(parts, part) - end - end - elseif target:IsA("BasePart") then - table.insert(parts, target) - end - - local size, cf = MeshUtil.getBoundingBoxAtCFrame(camCF, parts) - - TargetCFrame:Set(cf) - TargetSize:Set(Vector2.new(size.X, size.Y) * 2) - end)) - - -- assemble final parameters - local parameters: any = { - AnchorPoint = Vector2.new(0.5, 0.5), - WorldPosition = _Computed(function(cf: CFrame?) - if not cf then - return Vector2.new(0, 0) - end - assert(cf ~= nil) - return Vector2.new(cf.Position.X, cf.Position.Y) - end, TargetCFrame), - WorldSize = _Computed(function(size: Vector2?): Vector2 - if not size then - return Vector2.new(0, 0) - end - assert(size ~= nil) - return size - end, TargetSize), - Parent = Parent, - } - - config.Target = nil - - for k, v in pairs(config) do - if parameters[k] == nil then - parameters[k] = v - end - end - - -- construct output instance - local Output = MountFrame(maid)(parameters) - Util.cleanUpPrep(maid, Output) - - BoardFrame:Set(Output:FindFirstAncestorOfClass("ViewportFrame")) - maid:GiveTask(Output.AncestryChanged:Connect(function() - BoardFrame:Set(Output:FindFirstAncestorOfClass("ViewportFrame")) - end)) - - return Output -end - -return function(maid: Maid?) - return function(params: BoundingBoxFrameParameters): BoundingBoxFrame - local inst = Constructor(params) - if maid then - maid:GiveTask(inst) - end - return inst - end -end diff --git a/src/Bubble/demo.story.lua b/src/Bubble/demo.story.lua deleted file mode 100644 index 35281e8e..00000000 --- a/src/Bubble/demo.story.lua +++ /dev/null @@ -1,13 +0,0 @@ ---!strict - -return function(coreGui) - local module = require(script.Parent) - local demo = { - Name = "FX", - Parent = coreGui, - } - local object = module()(demo) - return function() - object:Destroy() - end -end diff --git a/src/Bubble/init.lua b/src/Bubble/init.lua deleted file mode 100644 index 3572a108..00000000 --- a/src/Bubble/init.lua +++ /dev/null @@ -1,133 +0,0 @@ ---!strict -local Package = script.Parent -assert(Package) -local Packages = Package.Parent -assert(Packages) - -local Util = require(Package:WaitForChild("Util")) - -local ColdFusion = require(Packages:WaitForChild("ColdFusion")) -type Fuse = ColdFusion.Fuse -type State = ColdFusion.State -type ValueState = ColdFusion.ValueState -type CanBeState = ColdFusion.CanBeState - -local Maid = require(Packages:WaitForChild("Maid")) -type Maid = Maid.Maid - -local EffectGui = require(Package:WaitForChild("EffectGui")) - -export type BubbleParameters = { - Name: CanBeState?, - Parent: CanBeState?, - Scale: CanBeState?, - BackgroundTransparency: CanBeState?, - FinalTransparency: CanBeState?, - BackgroundColor3: CanBeState?, -} - -export type Bubble = EffectGui.EffectGui - -function Constructor(config: BubbleParameters): Bubble - -- init workspace - local maid: Maid = Maid.new() - local _fuse: Fuse = ColdFusion.fuse(maid) - - local _new = _fuse.new - local _bind = _fuse.bind - local _import = _fuse.import - local _Value = _fuse.Value - local _Computed = _fuse.Computed - - -- unload config states - local Name = _import(config.Name, script.Name) - local Parent = _import(config.Parent, nil) - local Scale = _import(config.Scale, 1.25) - local BackgroundTransparency = _import(config.BackgroundTransparency, 0.6) - local FinalTransparency = _import(config.FinalTransparency, 1) - local BackgroundColor3 = _import(config.BackgroundColor3, Color3.fromHSV(0, 0, 0.7)) - - -- init internal states - local Value = _Value(0) - local ValueTween = Value:Tween(0.3, Enum.EasingStyle.Quad, Enum.EasingDirection.Out) - local AbsoluteSize = _Value(Vector2.new(0, 0)) - local CenterPosition = _Value(UDim2.fromOffset(0, 0)) - - -- construct internal instances - local bubbleFrame = _new("Frame")({ - Name = "Bubble", - Position = CenterPosition, - AnchorPoint = Vector2.new(0.5, 0.5), - BorderSizePixel = 0, - ZIndex = 1, - BackgroundColor3 = BackgroundColor3, - Size = _Computed(function(val: number, size: Vector2, scale: number) - local diameter = math.max(size.X, size.Y) * val * scale - return UDim2.fromOffset(diameter, diameter) - end, ValueTween, AbsoluteSize, Scale), - BackgroundTransparency = _Computed(function(val: number, background: number, max: number) - if val == 0 then - return background - else - return max - end - end, Value, BackgroundTransparency, FinalTransparency):Tween(0.3, Enum.EasingStyle.Quad, Enum.EasingDirection.In), - Children = { - _new("UICorner")({ - CornerRadius = UDim.new(0.5, 0), - }), - } :: { Instance }, - }) - maid:GiveTask(bubbleFrame) - - -- construct output instance - local Output: ScreenGui = EffectGui(maid)({ - Name = Name, - Parent = Parent, - } :: any) - bubbleFrame.Parent = Output - Util.cleanUpPrep(maid, Output) - - -- bind states to attributes - maid:GiveTask(Output:GetAttributeChangedSignal("AbsoluteSize"):Connect(function() - AbsoluteSize:Set(Output:GetAttribute("AbsoluteSize") or Vector2.new(0, 0)) - end)) - AbsoluteSize:Set(Output:GetAttribute("AbsoluteSize") or Vector2.new(0, 0)) - maid:GiveTask(Output:GetAttributeChangedSignal("CenterPosition"):Connect(function() - CenterPosition:Set(Output:GetAttribute("CenterPosition") or UDim2.fromOffset(0, 0)) - end)) - CenterPosition:Set(Output:GetAttribute("CenterPosition") or UDim2.fromOffset(0, 0)) - - -- bind functions to output - Util.bindFunction(Output, maid, "Fire", function() - Value:Set(1) - task.delay(0.4, function() - pcall(function() - Output:Destroy() - end) - end) - end) - Util.bindFunction(Output, maid, "Enable", function() - Value:Set(1) - end) - Util.bindFunction(Output, maid, "Disable", function() - Value:Set(0) - task.delay(0.4, function() - pcall(function() - Output:Destroy() - end) - end) - end) - - return Output -end - -return function(maid: Maid?) - return function(params: BubbleParameters): Bubble - local inst = Constructor(params) - if maid then - maid:GiveTask(inst) - end - return inst - end -end diff --git a/src/Button/demo.story.lua b/src/Button/demo.story.lua deleted file mode 100644 index 418bc37b..00000000 --- a/src/Button/demo.story.lua +++ /dev/null @@ -1,28 +0,0 @@ ---!strict - -return function(coreGui) - - local object: Instance - task.spawn(function() - local module = require(script.Parent) - local demo = { - Text = "Button *Time*", - BackgroundTransparency = 1, - BorderTransparency = 0, - TextSize = 20, - Padding = UDim.new(0, 8), - IconScale = 1, - TextOnly = false, - Position = UDim2.fromScale(0.5, 0.5), - AnchorPoint = Vector2.new(0.5, 0.5), - Parent = coreGui, - LeftIcon = "star", - RightIcon = "accessibility", - } - object = module()(demo) - end) - - return function() - object:Destroy() - end -end diff --git a/src/Button/init.lua b/src/Button/init.lua deleted file mode 100644 index 1cbb4932..00000000 --- a/src/Button/init.lua +++ /dev/null @@ -1,456 +0,0 @@ ---!strict -local SoundService = game:GetService("SoundService") -local RunService = game:GetService("RunService") -local TweenService = game:GetService("TweenService") - -local Package = script.Parent -assert(Package) -local Packages = Package.Parent -assert(Packages) - -local Util = require(Package:WaitForChild("Util")) -local Types = require(Package:WaitForChild("Types")) - -local ColdFusion = require(Packages:WaitForChild("ColdFusion")) -type Fuse = ColdFusion.Fuse -type State = ColdFusion.State -type ValueState = ColdFusion.ValueState -type CanBeState = ColdFusion.CanBeState - -local Maid = require(Packages:WaitForChild("Maid")) -type Maid = Maid.Maid - -local Signal = require(Packages:WaitForChild("Signal")) - -local TextLabel = require(Package:WaitForChild("TextLabel")) - -export type ButtonParameters = Types.FrameParameters & { - Padding: CanBeState?, - CornerRadius: CanBeState?, - TextSize: CanBeState?, - IconScale: CanBeState?, - TextColor3: CanBeState?, - Font: CanBeState?, - SelectedTextColor3: CanBeState?, - HoverTextColor3: CanBeState?, - BorderTransparency: CanBeState?, - BackgroundTransparency: CanBeState?, - SelectedBackgroundColor3: CanBeState?, - HoverBackgroundColor3: CanBeState?, - TextTransparency: CanBeState?, - TextXAlignment: CanBeState?, - TextYAlignment: CanBeState?, - Text: CanBeState?, - LeftIcon: CanBeState?, - RightIcon: CanBeState?, - ClickSound: CanBeState?, - TextOnly: CanBeState?, - IsSelected: CanBeState?, -} - -export type Button = Frame - -function Constructor(config: ButtonParameters): Button - -- init workspace - local maid: Maid = Maid.new() - local _fuse: Fuse = ColdFusion.fuse(maid) - - local _new = _fuse.new - local _bind = _fuse.bind - local _import = _fuse.import - local _Value = _fuse.Value - local _Computed = _fuse.Computed - - -- unload config states - local Name = _import(config.Name, script.Name) - local Padding = _import(config.Padding, UDim.new(0, 2)) - local CornerRadius = _import(config.CornerRadius, UDim.new(0, 4)) - local TextSize = _import(config.TextSize, 14) - local Size: State = _import(config.Size, nil :: Vector2?) - local IconScale = _import(config.IconScale, 1.25) - local BorderSizePixel = _import(config.BorderSizePixel, 3) - local TextColor3 = _import(config.TextColor3, Color3.new(0.2, 0.2, 0.2)) - local FontFace = _import(config.Font, Font.fromEnum(Enum.Font.GothamBold)) - local SelectedTextColor3 = _import(config.SelectedTextColor3, Color3.new(1, 1, 1)) - local HoverTextColor3 = _import(config.HoverTextColor3, Color3.new(0.2, 0.2, 0.2)) - local BackgroundColor3 = _import(config.BackgroundColor3, Color3.fromHSV(0.7, 0, 1)) - local BorderColor3 = _import(config.BorderColor3, Color3.fromHSV(0.7, 0, 0.3)) - local SelectedBackgroundColor3 = _import(config.SelectedBackgroundColor3, Color3.fromHSV(0.7, 0.7, 1)) - local HoverBackgroundColor3: State = _import( - config.HoverBackgroundColor3, - _Computed(function(sCol: Color3, bCol: Color3): Color3 - local h1, s1, v1 = sCol:ToHSV() - local _, s2, v2 = bCol:ToHSV() - return Color3.fromHSV(h1, s1 + (s2 - s1) * 0.5, v1 + (v2 - v1) * 0.5) - end, SelectedBackgroundColor3, BackgroundColor3) - ) :: any - local BackgroundTransparency: State = _import(config.BackgroundTransparency, 0) :: any - local TextTransparency = _import(config.TextTransparency, 0) - local TextXAlignment = _import(config.TextXAlignment, Enum.TextXAlignment.Center) - local TextYAlignment = _import(config.TextYAlignment, Enum.TextYAlignment.Center) - local Text = _import(config.Text, "") - local LeftIcon = _import(config.LeftIcon, "") - local RightIcon = _import(config.RightIcon, "") - local TextOnly = _import(config.TextOnly, false) - local IsSelected: ValueState = if config.IsSelected then if typeof(config.IsSelected) == "table" then config.IsSelected else _Value(config.IsSelected) else _Value(false) :: any - local ClickSound = _import(config.ClickSound, nil) - - -- init signals - local Activated = Signal.new() - maid:GiveTask(Activated) - local MouseButton1Down = Signal.new() - maid:GiveTask(MouseButton1Down) - local MouseButton1Up = Signal.new() - maid:GiveTask(MouseButton1Up) - local InputBegan = Signal.new() - maid:GiveTask(InputBegan) - local InputEnded = Signal.new() - maid:GiveTask(InputEnded) - - -- init internal states - local IsHovering = _Value(false) - local IsRippling = _Value(false) - local ClickCenter = _Value(0.5) - local ClickTick = _Value(0) - local MaxRippleDuration = _Value(0.4) - local TimeSinceLastClick = _Value(tick()) - local ActiveBorderColor3 = _Computed(function(trans, border, background) - if trans == 0 then - return background - else - return border - end - end, BackgroundTransparency, BorderColor3, BackgroundColor3) - local ActiveBorderTransparency = _Computed(function(backTrans) - if backTrans == 0 then - return 1 - else - return 0 - end - end, BackgroundTransparency) - local RippleAlpha = _Computed(function(timeSince: number, dur: number) - return math.clamp(timeSince / dur, 0, 1) - end, TimeSinceLastClick, MaxRippleDuration) - local bump = 0.01 - local LeftRippleAlpha = _Computed(function(alpha: number, center: number) - return math.clamp(center - alpha, bump * 2, 1 - bump * 2) - end, RippleAlpha, ClickCenter) - local RightRippleAlpha = _Computed(function(alpha: number, center: number) - return math.clamp(center + alpha, bump * 2, 1 - bump * 2) - end, RippleAlpha, ClickCenter) - local eDir = Enum.EasingDirection.InOut - local eSty = Enum.EasingStyle.Quad - local TimeKeys = _Computed(function(centerAlpha: number, leftAlpha: number, rightAlpha: number) - leftAlpha = math.clamp(TweenService:GetValue(leftAlpha, eSty, eDir), bump, math.max(centerAlpha - bump, bump * 2)) - rightAlpha = math.clamp(TweenService:GetValue(rightAlpha, eSty, eDir), math.min(centerAlpha + bump, 1 - bump * 2), 1 - bump) - return { - 0, - math.clamp(leftAlpha - bump, bump, math.clamp(centerAlpha - bump * 2, bump * 2, 1 - bump * 5)), - math.clamp(leftAlpha, bump * 2.5, math.clamp(centerAlpha - bump, bump * 3, 1 - bump * 4)), - math.clamp(rightAlpha, math.clamp(centerAlpha + bump, bump * 4, 1 - bump * 3), 1 - bump * 2), - math.clamp(rightAlpha + bump, math.clamp(centerAlpha + bump * 2, bump * 5, 1 - bump * 2), 1 - bump), - 1, - } - end, ClickCenter, LeftRippleAlpha, RightRippleAlpha) - local LabelAbsoluteSize = _Value(Vector2.new(0, 0)) - local ButtonSize = _Computed(function(padding: UDim, absSize: Vector2, size: Vector2?): UDim2 - if size then - return UDim2.fromOffset(size.X, size.Y) - end - absSize = absSize or Vector2.new(0, 0) - local fullSize = absSize + Vector2.new(1, 1) * padding.Offset * 2 - return UDim2.fromOffset(fullSize.X, fullSize.Y) - end, Padding, LabelAbsoluteSize, Size) - local ActiveBackgroundColor = _Computed(function(isPressing: boolean, isRippling: boolean, isHovering: boolean, backgroundColor: Color3, hoverColor: Color3, selColor: Color3) - if isHovering or isRippling then - return hoverColor - elseif isPressing then - return selColor - else - return backgroundColor - end - end, IsSelected, IsRippling, IsHovering, BackgroundColor3, HoverBackgroundColor3, SelectedBackgroundColor3):Tween(0.15) - local ActiveFillColor = _Computed(function(isPressing, isRipple, hoverColor, selectedColor) - if isPressing or isRipple then - return selectedColor - else - return hoverColor - end - end, IsSelected, IsRippling, ActiveBackgroundColor, SelectedBackgroundColor3):Tween(0.1) - - -- bind signals - maid:GiveTask(Activated:Connect(function() - local clickSound = ClickSound:Get() - if clickSound then - SoundService:PlayLocalSound(clickSound) - end - end)) - - -- construct sub-instances - local ButtonTextLabel = TextLabel(maid)({ - BackgroundTransparency = 1, - TextTransparency = TextTransparency, - ZIndex = 2, - FontFace = FontFace, - Padding = Padding, - TextSize = TextSize, - TextColor3 = _Computed(function(hover, press, ripple, textColor3, hoverColor, selColor) - if press or ripple then - return selColor - elseif hover then - return hoverColor - end - return textColor3 - end, IsHovering, IsSelected, IsRippling, TextColor3, HoverTextColor3, SelectedTextColor3):Tween(0.2), - TextXAlignment = TextXAlignment, - TextYAlignment = TextYAlignment, - - Text = Text, - IconScale = IconScale, - LeftIcon = LeftIcon, - RightIcon = RightIcon, - AnchorPoint = Vector2.new(0.5, 0.5), - Position = UDim2.fromScale(0.5, 0.5), - }) - maid:GiveTask(RunService.RenderStepped:Connect(function(deltaTime: number) - LabelAbsoluteSize:Set(ButtonTextLabel.AbsoluteSize) - end)) - - local TextButton: TextButton = _fuse.new("TextButton")({ - RichText = true, - TextColor3 = TextColor3, - LayoutOrder = 2, - ZIndex = 3, - Size = UDim2.fromScale(1, 1), - Position = UDim2.fromScale(0.5, 0.5), - AnchorPoint = Vector2.new(0.5, 0.5), - TextTransparency = TextTransparency, - Text = "", - Events = { - Activated = function() - Activated:Fire() - end, - MouseButton1Down = function(x: any) - MouseButton1Down:Fire() - - if not IsSelected:Get() and TimeSinceLastClick:Get() > 0.8 then - ClickTick:Set(tick()) - IsRippling:Set(true) - task.delay(MaxRippleDuration:Get() + 0.2, function() - pcall(function() - IsRippling:Set(false) - end) - end) - if IsSelected.Set then - local ValSelect: any = IsSelected - ValSelect:Set(true) - end - -- IsSelected:Set(true) - end - end, - MouseButton1Up = function() - MouseButton1Up:Fire() - if IsSelected.Set then - local ValSelect: any = IsSelected - ValSelect:Set(false) - end - end, - InputChanged = function() - IsHovering:Set(true) - end, - MouseLeave = function() - IsHovering:Set(false) - end, - }, - - BackgroundTransparency = 1, - AutomaticSize = Enum.AutomaticSize.XY, - }) :: any - - -- assemble final parameters - local parameters: any = { - Name = Name, - Size = ButtonSize, - BackgroundColor3 = Color3.new(1, 1, 1), - BackgroundTransparency = _Computed(function(textOnly) - if textOnly then - return 1 - else - return 0 - end - end, TextOnly), - Children = { - _fuse.new("UICorner")({ - CornerRadius = CornerRadius, - }), - _fuse.new("UIPadding")({ - PaddingBottom = Padding, - PaddingTop = Padding, - PaddingLeft = Padding, - PaddingRight = Padding, - }), - _fuse.new("UIStroke")({ - Transparency = ActiveBorderTransparency, - ApplyStrokeMode = Enum.ApplyStrokeMode.Border, - Thickness = _Computed(function(textOnly, bSizePix) - if textOnly then - return 0 - else - return bSizePix - end - end, TextOnly, BorderSizePixel), - Color = _Computed(function(border, fill, back, hover, press) - if press then - return fill - elseif hover then - return back - else - return border - end - end, ActiveBorderColor3, ActiveFillColor, ActiveBackgroundColor, IsHovering, IsSelected), - }), - _fuse.new("UIGradient")({ - Transparency = _Computed(function(hover: boolean, press: boolean, ripple: boolean, defTrans: number, timeKeys: { number }) - local fill = math.min(0.7, defTrans) - if ripple then - local startTrans = defTrans - local finishTrans = defTrans - - if timeKeys[5] < 0.99 then - finishTrans = defTrans - else - finishTrans = fill - end - - if timeKeys[2] > 0.01 then - startTrans = defTrans - else - startTrans = fill - end - -- print(timeKeys) - local k1 = NumberSequenceKeypoint.new(timeKeys[1], startTrans) - local k2 = NumberSequenceKeypoint.new(timeKeys[2], startTrans) - local k3 = NumberSequenceKeypoint.new(timeKeys[3], fill) - local k4 = NumberSequenceKeypoint.new(timeKeys[4], fill) - local k5 = NumberSequenceKeypoint.new(timeKeys[5], finishTrans) - local k6 = NumberSequenceKeypoint.new(timeKeys[6], finishTrans) - return NumberSequence.new({ k1, k2, k3, k4, k5, k6 }) - elseif press then - return NumberSequence.new({ - NumberSequenceKeypoint.new(0, fill), - NumberSequenceKeypoint.new(1, fill), - }) - elseif hover then - return NumberSequence.new({ - NumberSequenceKeypoint.new(0, defTrans), - NumberSequenceKeypoint.new(1, defTrans), - }) - end - return NumberSequence.new({ - NumberSequenceKeypoint.new(0, defTrans), - NumberSequenceKeypoint.new(1, defTrans), - }) - end, IsHovering, IsSelected, IsRippling, BackgroundTransparency, TimeKeys), - Color = _Computed(function(hover, press, ripple, backColor, selColor, timeKeys) - if ripple then - local beginColor = backColor - local finishColor = backColor - - if timeKeys[5] < 0.99 then - finishColor = backColor - else - finishColor = selColor - end - - if timeKeys[2] > 0.01 then - beginColor = backColor - else - beginColor = selColor - end - -- print(timeKeys) - local k1 = ColorSequenceKeypoint.new(timeKeys[1], beginColor) - local k2 = ColorSequenceKeypoint.new(timeKeys[2], beginColor) - local k3 = ColorSequenceKeypoint.new(timeKeys[3], selColor) - local k4 = ColorSequenceKeypoint.new(timeKeys[4], selColor) - local k5 = ColorSequenceKeypoint.new(timeKeys[5], finishColor) - local k6 = ColorSequenceKeypoint.new(timeKeys[6], finishColor) - return ColorSequence.new({ k1, k2, k3, k4, k5, k6 }) - elseif press then - return ColorSequence.new({ - ColorSequenceKeypoint.new(0, selColor), - ColorSequenceKeypoint.new(1, selColor), - }) - elseif hover then - return ColorSequence.new({ - ColorSequenceKeypoint.new(0, backColor), - ColorSequenceKeypoint.new(1, backColor), - }) - end - return ColorSequence.new({ - ColorSequenceKeypoint.new(0, backColor), - ColorSequenceKeypoint.new(1, backColor), - }) - end, IsHovering, IsSelected, IsRippling, ActiveBackgroundColor, ActiveFillColor, TimeKeys), - }), - TextButton, - ButtonTextLabel, - } :: { Instance }, - } - config.BorderTransparency = nil - config.Padding = nil - config.CornerRadius = nil - config.TextSize = nil - config.IconScale = nil - config.TextColor3 = nil - config.FontFace = nil - config.SelectedTextColor3 = nil - config.HoverTextColor3 = nil - config.SelectedBackgroundColor3 = nil - config.HoverBackgroundColor3 = nil - config.TextTransparency = nil - config.TextXAlignment = nil - config.TextYAlignment = nil - config.Text = nil - config.IsSelected = nil - config.LeftIcon = nil - config.RightIcon = nil - config.ClickSound = nil - config.TextOnly = nil - - for k, v in pairs(config) do - if parameters[k] == nil then - parameters[k] = v - end - end - - maid:GiveTask(RunService.RenderStepped:Connect(function(dt) - TimeSinceLastClick:Set(tick() - ClickTick:Get()) - end)) - - -- construct output instance - local Output: Frame = _fuse.new("Frame")(parameters) :: any - Util.bindSignal(Output, maid, "MouseButton1Down", MouseButton1Down) - Util.bindSignal(Output, maid, "MouseButton1Up", MouseButton1Up) - Util.bindSignal(Output, maid, "Activated", Activated) - - maid:GiveTask(TextButton.MouseButton1Down:Connect(function(x: number) - local xWidth = Output.AbsoluteSize.X - local xPos = Output.AbsolutePosition.X - local clickCenter = (x - xPos) / xWidth - ClickCenter:Set(clickCenter) - end)) - - Util.cleanUpPrep(maid, Output) - - return Output -end - -return function(maid: Maid?) - return function(params: ButtonParameters): Button - local inst = Constructor(params) - if maid then - maid:GiveTask(inst) - end - return inst - end -end diff --git a/src/Checkbox/demo.story.lua b/src/Checkbox/demo.story.lua deleted file mode 100644 index f447b98d..00000000 --- a/src/Checkbox/demo.story.lua +++ /dev/null @@ -1,39 +0,0 @@ ---!strict - -return function(coreGui) - local Module = script.Parent - assert(Module) - local Package = Module.Parent - assert(Package) - local Packages = Package.Parent - assert(Packages) - local module = require(Module) - local Maid = require(Packages:WaitForChild("Maid")) - local ColdFusion = require(Packages:WaitForChild("ColdFusion")) - - local maid = Maid.new() - local _fuse = ColdFusion.fuse(maid) - - local _new = _fuse.new - local _bind = _fuse.bind - local _import = _fuse.import - - local _Value = _fuse.Value - local _Computed = _fuse.Computed - - local demo: module.CheckboxParameters = { - Scale = 2, - BackgroundColor3 = Color3.fromHSV(0.75, 0.5, 1), - BorderColor3 = Color3.fromHSV(0, 0, 0.4), - Position = UDim2.fromScale(0.5, 0.5), - AnchorPoint = Vector2.new(0.5, 0.5), - Parent = coreGui, - Value = _Value(false), - } :: any - - local object = module()(demo) - return function() - maid:Destroy() - object:Destroy() - end -end diff --git a/src/Checkbox/init.lua b/src/Checkbox/init.lua deleted file mode 100644 index ed8d79f5..00000000 --- a/src/Checkbox/init.lua +++ /dev/null @@ -1,209 +0,0 @@ ---!strict -local SoundService = game:GetService("SoundService") - -local Package = script.Parent -assert(Package) -local Packages = Package.Parent -assert(Packages) - -local Util = require(Package:WaitForChild("Util")) - -local Types = require(Package:WaitForChild("Types")) - -local ColdFusion = require(Packages:WaitForChild("ColdFusion")) -type Fuse = ColdFusion.Fuse -type State = ColdFusion.State -type ValueState = ColdFusion.ValueState -type CanBeState = ColdFusion.CanBeState - -local Maid = require(Packages:WaitForChild("Maid")) -type Maid = Maid.Maid - -local Signal = require(Packages:WaitForChild("Signal")) - -local Bubble = require(Package:WaitForChild("Bubble")) - -export type CheckboxParameters = Types.FrameParameters & { - Scale: CanBeState?, - Value: ValueState, - EnableSound: CanBeState?, - DisableSound: CanBeState?, - TextColor3: CanBeState?, -} - -export type Checkbox = Frame - -function Constructor(config: CheckboxParameters): Checkbox - -- init workspace - local maid: Maid = Maid.new() - local _fuse: Fuse = ColdFusion.fuse(maid) - - local _new = _fuse.new - local _bind = _fuse.bind - local _import = _fuse.import - local _Value = _fuse.Value - local _Computed = _fuse.Computed - - -- unload config states - local Name = _import(config.Name, script.Name) - local Scale = _import(config.Scale, 1) - local BorderColor3 = _import(config.BorderColor3, Color3.fromHSV(0, 0, 0.4)) - local TextColor3 = _import(config.TextColor3, Color3.fromHSV(0, 0, 0.4)) - local BackgroundColor3 = _import(config.BackgroundColor3, Color3.fromHSV(0.6, 1, 1)) - local Value = config.Value :: any - local EnableSound: State = _import(config.EnableSound, nil :: Sound?) - local DisableSound: State = _import(config.DisableSound, nil :: Sound?) - - -- construct signals - local Activated = Signal.new() - maid:GiveTask(Activated) - - -- init internal states - local BubbleEnabled = _Value(false) - local Padding = _Computed(function(scale: number) - return math.round(6 * scale) - end, Scale) - local Width = _Computed(function(scale: number) - return math.round(scale * 20) - end, Scale) - local TweenColor = _Computed(function(val, borderColor3, backgroundColor3) - if not val then - return borderColor3 - else - return backgroundColor3 - end - end, Value, BorderColor3, BackgroundColor3):Tween() - - -- bind signals - maid:GiveTask(Activated:Connect(function() - if not (Value:Get() == true) then - local clickSound = EnableSound:Get() - if clickSound then - SoundService:PlayLocalSound(clickSound) - end - else - local clickSound = DisableSound:Get() - if clickSound then - SoundService:PlayLocalSound(clickSound) - end - end - if Value.Set then - Value:Set(not Value:Get()) - end - if BubbleEnabled:Get() == false then - BubbleEnabled:Set(true) - task.wait(0.2) - BubbleEnabled:Set(false) - end - end)) - - -- assemble final parameters - local Output: Frame - local parameters = { - Name = Name, - Size = _Computed(function(width: number) - return UDim2.fromOffset(width * 2, width * 2) - end, Width), - BackgroundTransparency = 1, - Children = { - _new("ImageButton")({ - Name = "Button", - ZIndex = 3, - BackgroundTransparency = 1, - ImageTransparency = 1, - Position = UDim2.fromScale(0.5, 0.5), - Size = UDim2.fromScale(1, 1), - AnchorPoint = Vector2.new(0.5, 0.5), - Events = { - Activated = function() - Activated:Fire() - if BubbleEnabled:Get() then - local bubble = Bubble(maid)({ - Parent = Output, - }) - local fireFunction: Instance? = bubble:WaitForChild("Fire") - assert(fireFunction ~= nil and fireFunction:IsA("BindableFunction")) - fireFunction:Invoke() - -- maid._bubble = bubble - end - end, - }, - }), - _new("ImageLabel")({ - Name = "ImageLabel", - ZIndex = 2, - Image = "rbxassetid://3926305904", - ImageRectOffset = Vector2.new(312, 4), - ImageRectSize = Vector2.new(24, 24), - ImageColor3 = TextColor3, - ImageTransparency = _Computed(function(val) - if val then - return 0 - else - return 1 - end - end, Value):Tween(), - Position = UDim2.fromScale(0.5, 0.5), - AnchorPoint = Vector2.new(0.5, 0.5), - BackgroundColor3 = TweenColor, - BackgroundTransparency = _Computed(function(val) - if val then - return 0 - else - return 0.999 - end - end, Value):Tween(), - Size = _Computed(function(width: number, padding: number) - return UDim2.fromOffset(width - padding, width - padding) - end, Width, Padding), - BorderSizePixel = 0, - Children = { - _new("UICorner")({ - CornerRadius = _Computed(function(padding: number) - return UDim.new(0, math.round(padding * 0.5)) - end, Padding), - }), - _new("UIStroke")({ - ApplyStrokeMode = Enum.ApplyStrokeMode.Border, - Thickness = _Computed(function(padding: number) - return math.round(padding * 0.25) - end, Padding), - Transparency = 0, - Color = TweenColor, - }), - } :: { Instance }, - }), - } :: { Instance }, - } - - config.Scale = nil - config.Value = nil :: any - config.EnableSound = nil - config.DisableSound = nil - config.TextColor3 = nil - - for k, v in pairs(config) do - if parameters[k] == nil then - parameters[k] = v - end - end - - -- Construct final gui - Output = _new("Frame")(parameters :: any) :: Frame - - -- Bind gui's life to maid - Util.cleanUpPrep(maid, Output) - Util.bindSignal(Output, maid, "Activated", Activated) - - return Output -end - -return function(maid: Maid?) - return function(params: CheckboxParameters): Checkbox - local inst = Constructor(params) - if maid then - maid:GiveTask(inst) - end - return inst - end -end diff --git a/src/EffectGui/demo.story.lua b/src/EffectGui/demo.story.lua deleted file mode 100644 index d7652c4f..00000000 --- a/src/EffectGui/demo.story.lua +++ /dev/null @@ -1,13 +0,0 @@ ---!strict - -return function(coreGui) - local module = require(script.Parent) - local demo: any = { - Name = "FX", - Parent = coreGui, - } - local object = module()(demo) - return function() - object:Destroy() - end -end diff --git a/src/EffectGui/init.lua b/src/EffectGui/init.lua deleted file mode 100644 index a76916f4..00000000 --- a/src/EffectGui/init.lua +++ /dev/null @@ -1,193 +0,0 @@ ---!strict -local RunService = game:GetService("RunService") - -local Package = script.Parent -assert(Package) -local Packages = Package.Parent -assert(Packages) - -local Util = require(Package:WaitForChild("Util")) - -local Types = require(Package:WaitForChild("Types")) - -local ColdFusion = require(Packages:WaitForChild("ColdFusion")) -type Fuse = ColdFusion.Fuse -type State = ColdFusion.State -type ValueState = ColdFusion.ValueState -type CanBeState = ColdFusion.CanBeState - -local Maid = require(Packages:WaitForChild("Maid")) -type Maid = Maid.Maid - -export type EffectGuiParameters = { - Enabled: ValueState, -} & Types.ScreenGuiParameters - -export type EffectGui = ScreenGui - -function Constructor(config: EffectGuiParameters): EffectGui - -- init workspace - local maid: Maid = Maid.new() - local _fuse: Fuse = ColdFusion.fuse(maid) - - local _new = _fuse.new - local _bind = _fuse.bind - local _import = _fuse.import - local _Value = _fuse.Value - local _Computed = _fuse.Computed - - -- unload config states - local Name = _import(config.Name, script.Name) - local Parent: State = _import(config.Parent, nil) :: any - local Enabled = config.Enabled - local ZIndexBehavior = _import(config.ZIndexBehavior, Enum.ZIndexBehavior.Sibling) - - -- init internal states - local OutputState = _Value(nil :: ScreenGui?) - local AncestorDisplayOrder = _Value(0) - local ParentAnchorPoint: ValueState = _Value(Vector2.new(0, 0)) - local AbsolutePosition: ValueState = _Value(Vector2.new(0, 0)) - local AbsoluteSize: ValueState = _Value(Vector2.new(0, 0)) - local Position: State = _Computed(function(absPos): UDim2 - absPos = absPos or Vector2.new(0, 0) - return UDim2.fromOffset(absPos.X, absPos.Y) - end, AbsolutePosition) - local AnchorPosition: State = _Computed(function(absPos, absSize, anchorPoint): UDim2 - absPos = absPos or Vector2.new(0, 0) - absSize = absSize or Vector2.new(0, 0) - anchorPoint = anchorPoint or Vector2.new(0, 0) - return UDim2.fromOffset(absPos.X + anchorPoint.X * absSize.X, absPos.Y + anchorPoint.Y * absSize.Y) - end, AbsolutePosition, AbsoluteSize, ParentAnchorPoint) - local CenterPosition: State = _Computed(function(absPos, absSize, anchorPoint): UDim2 - absPos = absPos or Vector2.new(0, 0) - absSize = absSize or Vector2.new(0, 0) - return UDim2.fromOffset(absPos.X + 0.5 * absSize.X, absPos.Y + 0.5 * absSize.Y) - end, AbsolutePosition, AbsoluteSize) - local Size: State = _Computed(function(absSize) - absSize = absSize or Vector2.new(0, 0) - return UDim2.fromOffset(absSize.X, absSize.Y) - end, AbsoluteSize) - local _KnownAncestorGui: ValueState = _Value(nil :: ScreenGui?) - local _AncestorGui = _Computed(function(known: ScreenGui?, output: ScreenGui?): ScreenGui? - if not output then - return - end - assert(output ~= nil) - local expected: ScreenGui? = output:FindFirstAncestorWhichIsA("ScreenGui") - local result - if known == expected then - result = expected - elseif known ~= nil then - result = known - else - result = expected - end - if result then - maid.onAncestorDisplayChange = result:GetPropertyChangedSignal("DisplayOrder"):Connect(function() - AncestorDisplayOrder:Set(result.DisplayOrder) - end) - AncestorDisplayOrder:Set(result.DisplayOrder) - else - AncestorDisplayOrder:Set(0) - end - return result - end, _KnownAncestorGui, OutputState) - local DisplayOrder = _Computed(function(gui: ScreenGui?, displayOrder: number) - if not gui then - return 1000 - end - assert(gui ~= nil and gui:IsA("ScreenGui")) - return (displayOrder or gui.DisplayOrder) + 1 - end, _AncestorGui, AncestorDisplayOrder) - - -- bind states to frame - maid:GiveTask(RunService.RenderStepped:Connect(function(dt: number) - local parent = Parent:Get() - if parent then - ParentAnchorPoint:Set(parent.AnchorPoint) - AbsolutePosition:Set(parent.AbsolutePosition) - AbsoluteSize:Set(parent.AbsoluteSize) - end - end)) - - -- assemble final parameters - local parameters: any = { - Name = Name, - DisplayOrder = DisplayOrder, - Enabled = Enabled, - ZIndexBehavior = ZIndexBehavior, - Parent = Parent, - Children = { - _new("Frame")({ - BackgroundTransparency = 1, - Size = _Computed(function(absSize: Vector2) - if not absSize then - return UDim2.fromOffset(0, 0) - end - return UDim2.fromOffset(absSize.X, absSize.Y) - end, AbsoluteSize), - Position = _Computed(function(absPos: Vector2) - if not absPos then - return UDim2.fromOffset(0, 0) - end - return UDim2.fromOffset(absPos.X, absPos.Y) - end, AbsolutePosition), - }), - } :: { Instance }, - } - for k, v in pairs(config) do - if parameters[k] == nil then - parameters[k] = v - end - end - - -- construct output instance - local Output = _fuse.new("ScreenGui")(parameters) :: any - OutputState:Set(Output) - Util.cleanUpPrep(maid, Output) - - -- bind states to output attributes - maid:GiveTask(Position:Connect(function(cur: UDim2) - Output:SetAttribute("Position", cur) - end)) - Output:SetAttribute("Position", Position:Get()) - - maid:GiveTask(AnchorPosition:Connect(function(cur: UDim2) - Output:SetAttribute("AnchorPosition", cur) - end)) - Output:SetAttribute("AnchorPosition", AnchorPosition:Get()) - - maid:GiveTask(AbsoluteSize:Connect(function(cur: Vector2) - Output:SetAttribute("AbsoluteSize", cur) - end)) - Output:SetAttribute("AbsoluteSize", AbsoluteSize:Get()) - - maid:GiveTask(CenterPosition:Connect(function(cur: UDim2) - Output:SetAttribute("CenterPosition", cur) - end)) - Output:SetAttribute("CenterPosition", CenterPosition:Get()) - - maid:GiveTask(Size:Connect(function(cur: UDim2) - Output:SetAttribute("Size", cur) - end)) - Output:SetAttribute("Size", Size:Get()) - - if Output:FindFirstAncestorWhichIsA("ScreenGui") then - _KnownAncestorGui:Set(Output:FindFirstAncestorWhichIsA("ScreenGui")) - end - maid:GiveTask(Output.AncestryChanged:Connect(function(ancestor) - _KnownAncestorGui:Set(Output:FindFirstAncestorWhichIsA("ScreenGui")) - end)) - - return Output -end - -return function(maid: Maid?) - return function(params: EffectGuiParameters): EffectGui - local inst = Constructor(params) - if maid then - maid:GiveTask(inst) - end - return inst - end -end diff --git a/src/Hint/demo.story.lua b/src/Hint/demo.story.lua deleted file mode 100644 index c6086c8b..00000000 --- a/src/Hint/demo.story.lua +++ /dev/null @@ -1,39 +0,0 @@ ---!strict -local ComponentModule = script.Parent -assert(ComponentModule) -local Package = ComponentModule.Parent -assert(Package) -local Packages = Package.Parent -assert(Packages) -return function(coreGui) - local module = require(ComponentModule) - local Maid = require(Packages:WaitForChild("Maid")) - local ColdFusion = require(Packages:WaitForChild("ColdFusion")) - - local maid = Maid.new() - local _fuse = ColdFusion.fuse(maid) - - local _new = _fuse.new - local _bind = _fuse.bind - local _import = _fuse.import - local _Value = _fuse.Value - local _Computed = _fuse.Computed - - local label = _new("TextLabel")({ - Parent = coreGui, - Text = "Text test lol", - AutomaticSize = Enum.AutomaticSize.XY, - AnchorPoint = Vector2.new(0.5, 0.5), - Position = UDim2.fromScale(0.5, 0.5), - }) - local hint = module()({ - Enabled = _Value(true), - Parent = label, - AnchorPoint = Vector2.new(0, 1), - Padding = UDim.new(0, 4), - Text = "Awesome button that is cool", - }) - return function() - hint:Destroy() - end -end diff --git a/src/Hint/init.lua b/src/Hint/init.lua deleted file mode 100644 index 40d63938..00000000 --- a/src/Hint/init.lua +++ /dev/null @@ -1,184 +0,0 @@ ---!strict -local Package = script.Parent -assert(Package) -local Packages = Package.Parent -assert(Packages) - -local Util = require(Package:WaitForChild("Util")) - -local ColdFusion = require(Packages:WaitForChild("ColdFusion")) -type Fuse = ColdFusion.Fuse -type State = ColdFusion.State -type ValueState = ColdFusion.ValueState -type CanBeState = ColdFusion.CanBeState - -local Maid = require(Packages:WaitForChild("Maid")) -type Maid = Maid.Maid - -local EffectGui = require(Package:WaitForChild("EffectGui")) -local TextLabel = require(Package:WaitForChild("TextLabel")) - -export type HintParameters = TextLabel.TextLabelParameters & { - Enabled: State?, - Padding: CanBeState?, - GapPadding: CanBeState?, - CornerRadius: CanBeState?, - Override: CanBeState?, -} - -export type Hint = ScreenGui - -function Constructor(config: HintParameters): Hint - -- init workspace - local maid = Maid.new() - local _fuse = ColdFusion.fuse(maid) - local _new = _fuse.new - local _bind = _fuse.bind - local _import = _fuse.import - local _Value = _fuse.Value - local _Computed = _fuse.Computed - - -- unload config states - local Name = _import(config.Name, script.Name) - local Parent: State = _import(config.Parent, nil :: GuiObject?) - local FontFace = _import(config.Font, Font.fromEnum(Enum.Font.Gotham)) - local Text = _import(config.Text, nil) - local TextSize = _import(config.TextSize, 10) - local AnchorPoint = _import(config.AnchorPoint, Vector2.new(0, 0)) - local Padding: State = _import(config.Padding, UDim.new(0, 2)) :: any - local GapPadding = _import(config.GapPadding, UDim.new(0, 6)) - local CornerRadius = _import(config.CornerRadius, UDim.new(0, 3)) - local BackgroundTransparency = _import(config.BackgroundTransparency, 0) - local TextTransparency = _import(config.TextTransparency, 0) - local BackgroundColor3 = _import(config.BackgroundColor3, Color3.fromHSV(0, 0, 0.7)) - local Enabled: State = if config.Enabled then config.Enabled else _Value(true) :: any - local Override = _import(config.Override, false) - - -- init internal states - local AbsoluteSize = _Value(Vector2.new(0, 0)) - local CenterPosition = _Value(UDim2.fromOffset(0, 0)) - local Visible = _Value(Override:Get()) - local ActiveTextTransparency = _Computed(function(enab, trans) - if enab then - return trans - else - return 1 - end - end, Enabled, TextTransparency):Tween() - _Computed(function(par: GuiObject?): nil - if par then - maid._parentInputBeginSignal = par.InputChanged:Connect(function() - if not Override:Get() then - Visible:Set(true) - end - local ValEnab: ValueState = Enabled :: any - if ValEnab.Set then - ValEnab:Set(true) - end - end) - maid._parentInputEndSignal = par.MouseLeave:Connect(function() - local ValEnab: ValueState = Enabled :: any - if ValEnab.Set then - ValEnab:Set(false) - end - task.wait(0.3) - pcall(function() - if Enabled:Get() == false then - if not Override:Get() then - Visible:Set(false) - end - end - end) - end) - end - return nil - end, Parent) - - -- filter sub-config - local tConfig: any = config - tConfig.Override = nil - tConfig.CornerRadius = nil - tConfig.GapPadding = nil - tConfig.Padding = nil - tConfig.AnchorPoint = nil - tConfig.Enabled = nil - tConfig.BackgroundColor3 = nil - tConfig.BackgroundTransparency = nil - tConfig.LeftIcon = nil - tConfig.RightIcon = nil - tConfig.Text = Text - tConfig.TextSize = TextSize - tConfig.FontFace = FontFace - tConfig.TextTransparency = ActiveTextTransparency - - -- construct sub-instance - local bubbleFrame = _new("Frame")({ - Name = "Hint", - Position = _Computed(function(center: UDim2, anchor: Vector2, size: Vector2, pad: UDim) - local pos: Vector2 = Vector2.new(center.X.Offset, center.Y.Offset) - local finalPoint = pos + (size * 0.5 + Vector2.new(1, 1) * pad.Offset) * anchor - return UDim2.fromOffset(finalPoint.X, finalPoint.Y) - end, CenterPosition, AnchorPoint, AbsoluteSize, GapPadding), - AnchorPoint = _Computed(function(anchor) - return Vector2.new(1, 1) * 0.5 - anchor - end, AnchorPoint), - BorderSizePixel = 0, - ZIndex = 1, - BackgroundColor3 = BackgroundColor3, - AutomaticSize = Enum.AutomaticSize.XY, - Size = UDim2.fromOffset(0, 0), - BackgroundTransparency = _Computed(function(background, enab) - if enab then - return background - else - return 1 - end - end, BackgroundTransparency, Enabled):Tween(), - - Children = { - _new("UIPadding")({ - PaddingBottom = Padding, - PaddingTop = Padding, - PaddingLeft = Padding, - PaddingRight = Padding, - }), - _new("UICorner")({ - CornerRadius = CornerRadius, - }), - TextLabel(maid)(tConfig), - } :: { Instance }, - }) - maid:GiveTask(bubbleFrame) - - -- assemble final parameters - local parameters: any = { - Name = Name, - Parent = Parent, - Enabled = Visible, - Children = {}, - } - - -- construct output instance - local Output: ScreenGui = EffectGui(maid)(parameters) - bubbleFrame.Parent = Output - maid:GiveTask(Output:GetAttributeChangedSignal("AbsoluteSize"):Connect(function() - AbsoluteSize:Set(Output:GetAttribute("AbsoluteSize") or Vector2.new(0, 0)) - end)) - - maid:GiveTask(Output:GetAttributeChangedSignal("CenterPosition"):Connect(function() - CenterPosition:Set(Output:GetAttribute("CenterPosition") or UDim2.fromOffset(0, 0)) - end)) - Util.cleanUpPrep(maid, Output) - - return Output -end - -return function(maid: Maid?) - return function(params: HintParameters): Hint - local inst = Constructor(params) - if maid then - maid:GiveTask(inst) - end - return inst - end -end diff --git a/src/IconLabel/Spritesheet/Sheet1.lua b/src/IconLabel/Spritesheet/Sheet1.lua deleted file mode 100644 index c0eae707..00000000 --- a/src/IconLabel/Spritesheet/Sheet1.lua +++ /dev/null @@ -1,506 +0,0 @@ -return { - note = { - [48] = { X = 420, Y = 836, Sheet = 3926309567 }, - [36] = { X = 244, Y = 924, Sheet = 3926305904 }, - [72] = { X = 536, Y = 612, Sheet = 3926319099 }, - [96] = { X = 204, Y = 904, Sheet = 3926330123 }, - }, - library_music = { - [72] = { X = 764, Y = 156, Sheet = 3926316119 }, - [36] = { X = 324, Y = 124, Sheet = 3926305904 }, - [96] = { X = 204, Y = 404, Sheet = 3926333840 }, - [48] = { X = 628, Y = 160, Sheet = 3926309567 }, - }, - gavel = { - [72] = { X = 384, Y = 80, Sheet = 3926316119 }, - [36] = { X = 84, Y = 44, Sheet = 3926305904 }, - [96] = { X = 4, Y = 704, Sheet = 3926334787 }, - [48] = { X = 56, Y = 628, Sheet = 3926309567 }, - }, - filter_5 = { - [72] = { X = 840, Y = 840, Sheet = 3926317787 }, - [36] = { X = 724, Y = 124, Sheet = 3926305904 }, - [96] = { X = 4, Y = 204, Sheet = 3926327588 }, - [48] = { X = 212, Y = 472, Sheet = 3926311105 }, - }, - home = { - [72] = { X = 612, Y = 460, Sheet = 3926317787 }, - [36] = { X = 964, Y = 204, Sheet = 3926305904 }, - [96] = { X = 704, Y = 904, Sheet = 3926334787 }, - [48] = { X = 784, Y = 576, Sheet = 3926307971 }, - }, - list = { - [72] = { X = 916, Y = 840, Sheet = 3926316119 }, - [36] = { X = 644, Y = 364, Sheet = 3926305904 }, - [96] = { X = 104, Y = 404, Sheet = 3926335698 }, - [48] = { X = 472, Y = 472, Sheet = 3926309567 }, - }, - time_to_leave = { - [72] = { X = 612, Y = 232, Sheet = 3926316119 }, - [36] = { X = 124, Y = 204, Sheet = 3926305904 }, - [96] = { X = 804, Y = 504, Sheet = 3926319860 }, - [48] = { X = 628, Y = 784, Sheet = 3926307971 }, - }, - contact_phone = { - [48] = { X = 836, Y = 56, Sheet = 3926311105 }, - [36] = { X = 644, Y = 764, Sheet = 3926305904 }, - [72] = { X = 308, Y = 460, Sheet = 3926319099 }, - [96] = { X = 304, Y = 804, Sheet = 3926326846 }, - }, - tap_and_play = { - [72] = { X = 764, Y = 764, Sheet = 3926317787 }, - [36] = { X = 404, Y = 804, Sheet = 3926305904 }, - [96] = { X = 804, Y = 864, Sheet = 3926319099 }, - [48] = { X = 600, Y = 524, Sheet = 3926307971 }, - }, - assistant = { - [72] = { X = 384, Y = 308, Sheet = 3926313458 }, - [36] = { X = 484, Y = 484, Sheet = 3926307971 }, - [96] = { X = 404, Y = 204, Sheet = 3926327588 }, - [48] = { X = 524, Y = 524, Sheet = 3926311105 }, - }, - access_alarms = { - [72] = { X = 80, Y = 388, Sheet = 3926312257 }, - [36] = { X = 924, Y = 164, Sheet = 3926307971 }, - [96] = { X = 4, Y = 904, Sheet = 3926328650 }, - [48] = { X = 368, Y = 56, Sheet = 3926312257 }, - }, - https = { - [72] = { X = 916, Y = 840, Sheet = 3926317787 }, - [36] = { X = 684, Y = 124, Sheet = 3926305904 }, - [96] = { X = 604, Y = 704, Sheet = 3926334787 }, - [48] = { X = 4, Y = 628, Sheet = 3926309567 }, - }, - stay_primary_portrait = { - [72] = { X = 384, Y = 308, Sheet = 3926317787 }, - [36] = { X = 324, Y = 804, Sheet = 3926305904 }, - [96] = { X = 4, Y = 504, Sheet = 3926321212 }, - [48] = { X = 56, Y = 732, Sheet = 3926309567 }, - }, - vibration = { - [72] = { X = 688, Y = 156, Sheet = 3926317787 }, - [36] = { X = 804, Y = 604, Sheet = 3926305904 }, - [96] = { X = 104, Y = 104, Sheet = 3926321212 }, - [48] = { X = 420, Y = 212, Sheet = 3926311105 }, - }, - group_work = { - [72] = { X = 232, Y = 764, Sheet = 3926317787 }, - [36] = { X = 524, Y = 164, Sheet = 3926305904 }, - [96] = { X = 704, Y = 604, Sheet = 3926334787 }, - [48] = { X = 784, Y = 680, Sheet = 3926307971 }, - }, - mail_outline = { - [72] = { X = 4, Y = 232, Sheet = 3926317787 }, - [36] = { X = 604, Y = 724, Sheet = 3926305904 }, - [96] = { X = 4, Y = 204, Sheet = 3926334787 }, - [48] = { X = 524, Y = 576, Sheet = 3926309567 }, - }, - airplanemode_active = { - [72] = { X = 384, Y = 156, Sheet = 3926314806 }, - [36] = { X = 124, Y = 364, Sheet = 3926305904 }, - [96] = { X = 304, Y = 204, Sheet = 3926328650 }, - [48] = { X = 212, Y = 316, Sheet = 3926311105 }, - }, - live_tv = { - [72] = { X = 384, Y = 536, Sheet = 3926316119 }, - [36] = { X = 524, Y = 404, Sheet = 3926305904 }, - [96] = { X = 404, Y = 404, Sheet = 3926335698 }, - [48] = { X = 576, Y = 108, Sheet = 3926309567 }, - }, - aspect_ratio = { - [72] = { X = 916, Y = 4, Sheet = 3926313458 }, - [36] = { X = 844, Y = 444, Sheet = 3926307971 }, - [96] = { X = 804, Y = 204, Sheet = 3926327588 }, - [48] = { X = 836, Y = 264, Sheet = 3926309567 }, - }, - grid_off = { - [72] = { X = 308, Y = 688, Sheet = 3926317787 }, - [36] = { X = 804, Y = 204, Sheet = 3926305904 }, - [96] = { X = 304, Y = 304, Sheet = 3926333840 }, - [48] = { X = 56, Y = 576, Sheet = 3926307971 }, - }, - local_airport = { - [72] = { X = 764, Y = 536, Sheet = 3926316119 }, - [36] = { X = 404, Y = 404, Sheet = 3926305904 }, - [96] = { X = 4, Y = 704, Sheet = 3926335698 }, - [48] = { X = 576, Y = 212, Sheet = 3926309567 }, - }, - unfold_less = { - [48] = { X = 836, Y = 316, Sheet = 3926309567 }, - [36] = { X = 564, Y = 524, Sheet = 3926305904 }, - [72] = { X = 764, Y = 80, Sheet = 3926319099 }, - [96] = { X = 804, Y = 204, Sheet = 3926319860 }, - }, - mood = { - [72] = { X = 460, Y = 232, Sheet = 3926317787 }, - [36] = { X = 244, Y = 804, Sheet = 3926305904 }, - [96] = { X = 504, Y = 4, Sheet = 3926334787 }, - [48] = { X = 108, Y = 732, Sheet = 3926309567 }, - }, - translate = { - [72] = { X = 384, Y = 384, Sheet = 3926314806 }, - [36] = { X = 724, Y = 364, Sheet = 3926305904 }, - [96] = { X = 204, Y = 4, Sheet = 3926319860 }, - [48] = { X = 108, Y = 524, Sheet = 3926311105 }, - }, - settings_power = { - [72] = { X = 612, Y = 388, Sheet = 3926312257 }, - [36] = { X = 444, Y = 204, Sheet = 3926307971 }, - [96] = { X = 204, Y = 404, Sheet = 3926330123 }, - [48] = { X = 472, Y = 732, Sheet = 3926307971 }, - }, - open_with = { - [72] = { X = 80, Y = 692, Sheet = 3926312257 }, - [36] = { X = 564, Y = 964, Sheet = 3926305904 }, - [96] = { X = 104, Y = 604, Sheet = 3926330123 }, - [48] = { X = 732, Y = 888, Sheet = 3926309567 }, - }, - local_gas_station = { - [72] = { X = 156, Y = 232, Sheet = 3926314806 }, - [36] = { X = 844, Y = 484, Sheet = 3926305904 }, - [96] = { X = 4, Y = 304, Sheet = 3926334787 }, - [48] = { X = 420, Y = 420, Sheet = 3926309567 }, - }, - brightness_4 = { - [72] = { X = 308, Y = 312, Sheet = 3926312257 }, - [36] = { X = 564, Y = 4, Sheet = 3926307971 }, - [96] = { X = 104, Y = 804, Sheet = 3926329330 }, - [48] = { X = 524, Y = 212, Sheet = 3926311105 }, - }, - panorama_horizontal = { - [72] = { X = 156, Y = 388, Sheet = 3926312257 }, - [36] = { X = 84, Y = 884, Sheet = 3926305904 }, - [96] = { X = 504, Y = 904, Sheet = 3926330123 }, - [48] = { X = 108, Y = 940, Sheet = 3926309567 }, - }, - brightness_medium = { - [72] = { X = 840, Y = 692, Sheet = 3926312257 }, - [36] = { X = 164, Y = 204, Sheet = 3926307971 }, - [96] = { X = 604, Y = 104, Sheet = 3926329330 }, - [48] = { X = 420, Y = 56, Sheet = 3926311105 }, - }, - not_interested = { - [48] = { X = 524, Y = 784, Sheet = 3926309567 }, - [36] = { X = 364, Y = 924, Sheet = 3926305904 }, - [72] = { X = 156, Y = 4, Sheet = 3926319099 }, - [96] = { X = 604, Y = 504, Sheet = 3926330123 }, - }, - border_top = { - [72] = { X = 764, Y = 688, Sheet = 3926314806 }, - [36] = { X = 524, Y = 164, Sheet = 3926307971 }, - [96] = { X = 704, Y = 504, Sheet = 3926329330 }, - [48] = { X = 576, Y = 160, Sheet = 3926311105 }, - }, - library_add = { - [72] = { X = 840, Y = 156, Sheet = 3926316119 }, - [36] = { X = 244, Y = 124, Sheet = 3926305904 }, - [96] = { X = 4, Y = 404, Sheet = 3926333840 }, - [48] = { X = 420, Y = 4, Sheet = 3926309567 }, - }, - desktop_windows = { - [48] = { X = 472, Y = 940, Sheet = 3926311105 }, - [36] = { X = 164, Y = 524, Sheet = 3926305904 }, - [72] = { X = 612, Y = 4, Sheet = 3926319099 }, - [96] = { X = 104, Y = 504, Sheet = 3926326846 }, - }, - hdr_weak = { - [72] = { X = 840, Y = 764, Sheet = 3926317787 }, - [36] = { X = 604, Y = 844, Sheet = 3926305904 }, - [96] = { X = 4, Y = 604, Sheet = 3926334787 }, - [48] = { X = 316, Y = 576, Sheet = 3926307971 }, - }, - confirmation_number = { - [72] = { X = 688, Y = 232, Sheet = 3926317787 }, - [36] = { X = 964, Y = 764, Sheet = 3926305904 }, - [96] = { X = 504, Y = 804, Sheet = 3926326846 }, - [48] = { X = 472, Y = 160, Sheet = 3926311105 }, - }, - brightness_low = { - [72] = { X = 308, Y = 768, Sheet = 3926312257 }, - [36] = { X = 684, Y = 204, Sheet = 3926307971 }, - [96] = { X = 204, Y = 104, Sheet = 3926329330 }, - [48] = { X = 680, Y = 212, Sheet = 3926311105 }, - }, - local_offer = { - [48] = { X = 264, Y = 264, Sheet = 3926309567 }, - [36] = { X = 764, Y = 524, Sheet = 3926305904 }, - [72] = { X = 612, Y = 80, Sheet = 3926319099 }, - [96] = { X = 304, Y = 604, Sheet = 3926335698 }, - }, - adjust = { - [72] = { X = 460, Y = 536, Sheet = 3926314806 }, - [36] = { X = 444, Y = 324, Sheet = 3926307971 }, - [96] = { X = 704, Y = 704, Sheet = 3926328650 }, - [48] = { X = 732, Y = 316, Sheet = 3926311105 }, - }, - play_arrow = { - [72] = { X = 536, Y = 80, Sheet = 3926314806 }, - [36] = { X = 764, Y = 244, Sheet = 3926307971 }, - [96] = { X = 604, Y = 604, Sheet = 3926330123 }, - [48] = { X = 784, Y = 576, Sheet = 3926309567 }, - }, - all_inclusive = { - [72] = { X = 536, Y = 156, Sheet = 3926313458 }, - [36] = { X = 164, Y = 84, Sheet = 3926307971 }, - [96] = { X = 604, Y = 804, Sheet = 3926328650 }, - [48] = { X = 732, Y = 264, Sheet = 3926311105 }, - }, - call = { - [72] = { X = 460, Y = 540, Sheet = 3926312257 }, - [36] = { X = 564, Y = 884, Sheet = 3926305904 }, - [96] = { X = 704, Y = 304, Sheet = 3926328650 }, - [48] = { X = 56, Y = 784, Sheet = 3926311105 }, - }, - perm_contact_calendar = { - [72] = { X = 764, Y = 236, Sheet = 3926312257 }, - [36] = { X = 564, Y = 164, Sheet = 3926307971 }, - [96] = { X = 704, Y = 704, Sheet = 3926330123 }, - [48] = { X = 888, Y = 888, Sheet = 3926309567 }, - }, - grain = { - [72] = { X = 916, Y = 4, Sheet = 3926316119 }, - [36] = { X = 644, Y = 44, Sheet = 3926305904 }, - [96] = { X = 104, Y = 304, Sheet = 3926333840 }, - [48] = { X = 4, Y = 628, Sheet = 3926307971 }, - }, - invert_colors_off = { - [72] = { X = 764, Y = 460, Sheet = 3926316119 }, - [36] = { X = 324, Y = 484, Sheet = 3926305904 }, - [96] = { X = 404, Y = 4, Sheet = 3926333840 }, - [48] = { X = 836, Y = 836, Sheet = 3926307971 }, - }, - photo_filter = { - [72] = { X = 308, Y = 916, Sheet = 3926314806 }, - [36] = { X = 644, Y = 244, Sheet = 3926307971 }, - [96] = { X = 4, Y = 4, Sheet = 3926329330 }, - [48] = { X = 160, Y = 680, Sheet = 3926309567 }, - }, - chrome_reader_mode = { - [48] = { X = 784, Y = 108, Sheet = 3926311105 }, - [36] = { X = 684, Y = 964, Sheet = 3926305904 }, - [72] = { X = 232, Y = 308, Sheet = 3926319099 }, - [96] = { X = 304, Y = 704, Sheet = 3926329330 }, - }, - stay_current_landscape = { - [48] = { X = 368, Y = 524, Sheet = 3926309567 }, - [36] = { X = 364, Y = 764, Sheet = 3926305904 }, - [72] = { X = 4, Y = 612, Sheet = 3926319099 }, - [96] = { X = 704, Y = 864, Sheet = 3926319099 }, - }, - import_export = { - [72] = { X = 4, Y = 612, Sheet = 3926317787 }, - [36] = { X = 884, Y = 84, Sheet = 3926305904 }, - [96] = { X = 4, Y = 904, Sheet = 3926334787 }, - [48] = { X = 108, Y = 732, Sheet = 3926307971 }, - }, - gps_off = { - [72] = { X = 232, Y = 460, Sheet = 3926316119 }, - [36] = { X = 284, Y = 44, Sheet = 3926305904 }, - [96] = { X = 304, Y = 504, Sheet = 3926334787 }, - [48] = { X = 940, Y = 576, Sheet = 3926307971 }, - }, - exposure_neg_1 = { - [72] = { X = 4, Y = 460, Sheet = 3926314806 }, - [36] = { X = 604, Y = 284, Sheet = 3926305904 }, - [96] = { X = 604, Y = 4, Sheet = 3926326846 }, - [48] = { X = 472, Y = 524, Sheet = 3926311105 }, - }, - compare = { - [48] = { X = 784, Y = 732, Sheet = 3926311105 }, - [36] = { X = 764, Y = 924, Sheet = 3926305904 }, - [72] = { X = 4, Y = 536, Sheet = 3926319099 }, - [96] = { X = 704, Y = 804, Sheet = 3926326846 }, - }, - local_pharmacy = { - [48] = { X = 784, Y = 212, Sheet = 3926309567 }, - [36] = { X = 724, Y = 604, Sheet = 3926305904 }, - [72] = { X = 308, Y = 612, Sheet = 3926319099 }, - [96] = { X = 204, Y = 304, Sheet = 3926335698 }, - }, - sentiment_very_dissatisfied = { - [72] = { X = 916, Y = 920, Sheet = 3926312257 }, - [36] = { X = 604, Y = 324, Sheet = 3926307971 }, - [96] = { X = 604, Y = 204, Sheet = 3926330123 }, - [48] = { X = 56, Y = 628, Sheet = 3926307971 }, - }, - battery_charging_20 = { - [72] = { X = 688, Y = 80, Sheet = 3926313458 }, - [36] = { X = 204, Y = 324, Sheet = 3926307971 }, - [96] = { X = 4, Y = 704, Sheet = 3926328650 }, - [48] = { X = 264, Y = 888, Sheet = 3926311105 }, - }, - more_vert = { - [72] = { X = 232, Y = 308, Sheet = 3926317787 }, - [36] = { X = 764, Y = 764, Sheet = 3926305904 }, - [96] = { X = 604, Y = 404, Sheet = 3926334787 }, - [48] = { X = 212, Y = 680, Sheet = 3926309567 }, - }, - add_circle = { - [72] = { X = 536, Y = 692, Sheet = 3926312257 }, - [36] = { X = 364, Y = 164, Sheet = 3926307971 }, - [96] = { X = 604, Y = 504, Sheet = 3926328650 }, - [48] = { X = 108, Y = 108, Sheet = 3926312257 }, - }, - directions_transit = { - [48] = { X = 212, Y = 680, Sheet = 3926311105 }, - [36] = { X = 844, Y = 684, Sheet = 3926305904 }, - [72] = { X = 308, Y = 156, Sheet = 3926319099 }, - [96] = { X = 104, Y = 4, Sheet = 3926321212 }, - }, - filter_center_focus = { - [72] = { X = 688, Y = 460, Sheet = 3926317787 }, - [36] = { X = 84, Y = 244, Sheet = 3926305904 }, - [96] = { X = 304, Y = 4, Sheet = 3926327588 }, - [48] = { X = 108, Y = 420, Sheet = 3926311105 }, - }, - storage = { - [72] = { X = 384, Y = 4, Sheet = 3926317787 }, - [36] = { X = 284, Y = 684, Sheet = 3926305904 }, - [96] = { X = 4, Y = 404, Sheet = 3926321212 }, - [48] = { X = 784, Y = 472, Sheet = 3926309567 }, - }, - view_module = { - [72] = { X = 384, Y = 688, Sheet = 3926313458 }, - [36] = { X = 204, Y = 884, Sheet = 3926305904 }, - [96] = { X = 4, Y = 604, Sheet = 3926319860 }, - [48] = { X = 108, Y = 836, Sheet = 3926311105 }, - }, - filter_2 = { - [72] = { X = 612, Y = 536, Sheet = 3926317787 }, - [36] = { X = 364, Y = 444, Sheet = 3926305904 }, - [96] = { X = 204, Y = 804, Sheet = 3926327588 }, - [48] = { X = 888, Y = 4, Sheet = 3926312257 }, - }, - crop_3_2 = { - [72] = { X = 308, Y = 4, Sheet = 3926317787 }, - [36] = { X = 524, Y = 684, Sheet = 3926305904 }, - [96] = { X = 404, Y = 904, Sheet = 3926326846 }, - [48] = { X = 56, Y = 108, Sheet = 3926311105 }, - }, - replay_30 = { - [72] = { X = 536, Y = 4, Sheet = 3926313458 }, - [36] = { X = 604, Y = 284, Sheet = 3926307971 }, - [96] = { X = 504, Y = 704, Sheet = 3926333840 }, - [48] = { X = 836, Y = 56, Sheet = 3926309567 }, - }, - functions = { - [72] = { X = 4, Y = 4, Sheet = 3926316119 }, - [36] = { X = 204, Y = 244, Sheet = 3926305904 }, - [96] = { X = 204, Y = 204, Sheet = 3926329330 }, - [48] = { X = 888, Y = 680, Sheet = 3926307971 }, - }, - monetization_on = { - [48] = { X = 732, Y = 524, Sheet = 3926309567 }, - [36] = { X = 844, Y = 764, Sheet = 3926305904 }, - [72] = { X = 460, Y = 460, Sheet = 3926319099 }, - [96] = { X = 404, Y = 104, Sheet = 3926334787 }, - }, - train = { - [72] = { X = 536, Y = 308, Sheet = 3926314806 }, - [36] = { X = 164, Y = 444, Sheet = 3926305904 }, - [96] = { X = 604, Y = 204, Sheet = 3926321212 }, - [48] = { X = 836, Y = 108, Sheet = 3926312257 }, - }, - filter_b_and_w = { - [72] = { X = 156, Y = 612, Sheet = 3926317787 }, - [36] = { X = 924, Y = 124, Sheet = 3926305904 }, - [96] = { X = 204, Y = 4, Sheet = 3926327588 }, - [48] = { X = 4, Y = 420, Sheet = 3926311105 }, - }, - add_circle_outline = { - [72] = { X = 308, Y = 616, Sheet = 3926312257 }, - [36] = { X = 764, Y = 164, Sheet = 3926307971 }, - [96] = { X = 4, Y = 604, Sheet = 3926328650 }, - [48] = { X = 940, Y = 264, Sheet = 3926311105 }, - }, - text_fields = { - [72] = { X = 384, Y = 840, Sheet = 3926317787 }, - [36] = { X = 244, Y = 164, Sheet = 3926305904 }, - [96] = { X = 4, Y = 804, Sheet = 3926319860 }, - [48] = { X = 108, Y = 628, Sheet = 3926307971 }, - }, - multiline_chart = { - [72] = { X = 384, Y = 232, Sheet = 3926317787 }, - [36] = { X = 524, Y = 924, Sheet = 3926305904 }, - [96] = { X = 504, Y = 404, Sheet = 3926334787 }, - [48] = { X = 472, Y = 524, Sheet = 3926309567 }, - }, - do_not_disturb_alt = { - [72] = { X = 840, Y = 916, Sheet = 3926316119 }, - [36] = { X = 844, Y = 524, Sheet = 3926305904 }, - [96] = { X = 204, Y = 404, Sheet = 3926321212 }, - [48] = { X = 4, Y = 264, Sheet = 3926309567 }, - }, - exposure_plus_2 = { - [72] = { X = 308, Y = 384, Sheet = 3926314806 }, - [36] = { X = 4, Y = 324, Sheet = 3926305904 }, - [96] = { X = 604, Y = 904, Sheet = 3926327588 }, - [48] = { X = 212, Y = 576, Sheet = 3926311105 }, - }, - local_car_wash = { - [72] = { X = 232, Y = 764, Sheet = 3926316119 }, - [36] = { X = 924, Y = 844, Sheet = 3926305904 }, - [96] = { X = 404, Y = 504, Sheet = 3926335698 }, - [48] = { X = 680, Y = 108, Sheet = 3926309567 }, - }, - flip_to_back = { - [72] = { X = 384, Y = 460, Sheet = 3926316119 }, - [36] = { X = 564, Y = 44, Sheet = 3926305904 }, - [96] = { X = 4, Y = 304, Sheet = 3926326846 }, - [48] = { X = 160, Y = 264, Sheet = 3926311105 }, - }, - access_time = { - [72] = { X = 156, Y = 464, Sheet = 3926312257 }, - [36] = { X = 564, Y = 84, Sheet = 3926307971 }, - [96] = { X = 704, Y = 904, Sheet = 3926328650 }, - [48] = { X = 160, Y = 4, Sheet = 3926312257 }, - }, - network_check = { - [72] = { X = 232, Y = 80, Sheet = 3926317787 }, - [36] = { X = 124, Y = 764, Sheet = 3926305904 }, - [96] = { X = 604, Y = 204, Sheet = 3926334787 }, - [48] = { X = 628, Y = 732, Sheet = 3926309567 }, - }, - linear_scale = { - [72] = { X = 840, Y = 80, Sheet = 3926316119 }, - [36] = { X = 684, Y = 364, Sheet = 3926305904 }, - [96] = { X = 4, Y = 804, Sheet = 3926334787 }, - [48] = { X = 888, Y = 108, Sheet = 3926309567 }, - }, - panorama = { - [72] = { X = 232, Y = 464, Sheet = 3926312257 }, - [36] = { X = 164, Y = 884, Sheet = 3926305904 }, - [96] = { X = 404, Y = 804, Sheet = 3926330123 }, - [48] = { X = 940, Y = 888, Sheet = 3926309567 }, - }, - videocam_off = { - [72] = { X = 612, Y = 308, Sheet = 3926317787 }, - [36] = { X = 524, Y = 564, Sheet = 3926305904 }, - [96] = { X = 904, Y = 804, Sheet = 3926321212 }, - [48] = { X = 108, Y = 108, Sheet = 3926311105 }, - }, - info_outline = { - [72] = { X = 764, Y = 612, Sheet = 3926316119 }, - [36] = { X = 204, Y = 444, Sheet = 3926305904 }, - [96] = { X = 204, Y = 304, Sheet = 3926333840 }, - [48] = { X = 628, Y = 732, Sheet = 3926307971 }, - }, - timelapse = { - [72] = { X = 4, Y = 308, Sheet = 3926316119 }, - [36] = { X = 444, Y = 124, Sheet = 3926305904 }, - [96] = { X = 204, Y = 864, Sheet = 3926319099 }, - [48] = { X = 680, Y = 4, Sheet = 3926312257 }, - }, - theaters = { - [72] = { X = 308, Y = 80, Sheet = 3926316119 }, - [36] = { X = 864, Y = 4, Sheet = 3926305904 }, - [96] = { X = 204, Y = 704, Sheet = 3926319860 }, - [48] = { X = 940, Y = 628, Sheet = 3926309567 }, - }, - format_textdirection_r_to_l = { - [72] = { X = 156, Y = 460, Sheet = 3926316119 }, - [36] = { X = 804, Y = 84, Sheet = 3926305904 }, - [96] = { X = 104, Y = 4, Sheet = 3926326846 }, - [48] = { X = 940, Y = 732, Sheet = 3926307971 }, - }, -} diff --git a/src/IconLabel/Spritesheet/Sheet10.lua b/src/IconLabel/Spritesheet/Sheet10.lua deleted file mode 100644 index 17e26907..00000000 --- a/src/IconLabel/Spritesheet/Sheet10.lua +++ /dev/null @@ -1,507 +0,0 @@ -return { - video_call = { - [72] = { X = 156, Y = 80, Sheet = 3926317787 }, - [36] = { X = 364, Y = 684, Sheet = 3926305904 }, - [96] = { X = 4, Y = 104, Sheet = 3926321212 }, - [48] = { X = 264, Y = 56, Sheet = 3926311105 }, - }, - sync = { - [72] = { X = 4, Y = 688, Sheet = 3926316119 }, - [36] = { X = 884, Y = 244, Sheet = 3926305904 }, - [96] = { X = 604, Y = 804, Sheet = 3926321212 }, - [48] = { X = 888, Y = 732, Sheet = 3926307971 }, - }, - local_phone = { - [48] = { X = 160, Y = 264, Sheet = 3926309567 }, - [36] = { X = 364, Y = 604, Sheet = 3926305904 }, - [72] = { X = 460, Y = 688, Sheet = 3926319099 }, - [96] = { X = 104, Y = 304, Sheet = 3926335698 }, - }, - exposure_zero = { - [72] = { X = 4, Y = 384, Sheet = 3926314806 }, - [36] = { X = 604, Y = 244, Sheet = 3926305904 }, - [96] = { X = 704, Y = 804, Sheet = 3926327588 }, - [48] = { X = 4, Y = 576, Sheet = 3926311105 }, - }, - keyboard_hide = { - [72] = { X = 4, Y = 80, Sheet = 3926314806 }, - [36] = { X = 724, Y = 244, Sheet = 3926305904 }, - [96] = { X = 204, Y = 204, Sheet = 3926333840 }, - [48] = { X = 212, Y = 940, Sheet = 3926307971 }, - }, - keyboard_arrow_left = { - [72] = { X = 232, Y = 688, Sheet = 3926316119 }, - [36] = { X = 724, Y = 284, Sheet = 3926305904 }, - [96] = { X = 504, Y = 104, Sheet = 3926333840 }, - [48] = { X = 108, Y = 836, Sheet = 3926307971 }, - }, - navigate_before = { - [72] = { X = 764, Y = 4, Sheet = 3926317787 }, - [36] = { X = 244, Y = 284, Sheet = 3926305904 }, - [96] = { X = 4, Y = 4, Sheet = 3926334787 }, - [48] = { X = 212, Y = 524, Sheet = 3926309567 }, - }, - fast_rewind = { - [72] = { X = 308, Y = 688, Sheet = 3926316119 }, - [36] = { X = 804, Y = 284, Sheet = 3926305904 }, - [96] = { X = 704, Y = 704, Sheet = 3926327588 }, - [48] = { X = 732, Y = 576, Sheet = 3926311105 }, - }, - collections = { - [48] = { X = 680, Y = 732, Sheet = 3926311105 }, - [36] = { X = 844, Y = 924, Sheet = 3926305904 }, - [72] = { X = 840, Y = 460, Sheet = 3926319099 }, - [96] = { X = 504, Y = 4, Sheet = 3926327588 }, - }, - portrait = { - [72] = { X = 80, Y = 156, Sheet = 3926314806 }, - [36] = { X = 964, Y = 244, Sheet = 3926305904 }, - [96] = { X = 804, Y = 204, Sheet = 3926329330 }, - [48] = { X = 836, Y = 368, Sheet = 3926309567 }, - }, - explore = { - [72] = { X = 536, Y = 232, Sheet = 3926314806 }, - [36] = { X = 924, Y = 284, Sheet = 3926305904 }, - [96] = { X = 804, Y = 4, Sheet = 3926326846 }, - [48] = { X = 420, Y = 524, Sheet = 3926311105 }, - }, - explicit = { - [72] = { X = 764, Y = 232, Sheet = 3926314806 }, - [36] = { X = 364, Y = 284, Sheet = 3926305904 }, - [96] = { X = 104, Y = 704, Sheet = 3926326846 }, - [48] = { X = 836, Y = 472, Sheet = 3926311105 }, - }, - keyboard_arrow_down = { - [72] = { X = 384, Y = 688, Sheet = 3926316119 }, - [36] = { X = 404, Y = 284, Sheet = 3926305904 }, - [96] = { X = 904, Y = 404, Sheet = 3926333840 }, - [48] = { X = 420, Y = 940, Sheet = 3926307971 }, - }, - label_outline = { - [72] = { X = 460, Y = 232, Sheet = 3926314806 }, - [36] = { X = 324, Y = 284, Sheet = 3926305904 }, - [96] = { X = 804, Y = 304, Sheet = 3926333840 }, - [48] = { X = 784, Y = 4, Sheet = 3926309567 }, - }, - battery_std = { - [72] = { X = 232, Y = 156, Sheet = 3926314806 }, - [36] = { X = 4, Y = 364, Sheet = 3926305904 }, - [96] = { X = 104, Y = 304, Sheet = 3926327588 }, - [48] = { X = 680, Y = 628, Sheet = 3926311105 }, - }, - looks_two = { - [72] = { X = 156, Y = 384, Sheet = 3926317787 }, - [36] = { X = 724, Y = 644, Sheet = 3926305904 }, - [96] = { X = 504, Y = 204, Sheet = 3926334787 }, - [48] = { X = 160, Y = 420, Sheet = 3926309567 }, - }, - beenhere = { - [72] = { X = 384, Y = 916, Sheet = 3926314806 }, - [36] = { X = 284, Y = 364, Sheet = 3926305904 }, - [96] = { X = 104, Y = 4, Sheet = 3926327588 }, - [48] = { X = 108, Y = 264, Sheet = 3926309567 }, - }, - format_align_justify = { - [72] = { X = 688, Y = 4, Sheet = 3926316119 }, - [36] = { X = 464, Y = 4, Sheet = 3926305904 }, - [96] = { X = 104, Y = 404, Sheet = 3926326846 }, - [48] = { X = 628, Y = 368, Sheet = 3926311105 }, - }, - crop_7_5 = { - [72] = { X = 764, Y = 80, Sheet = 3926317787 }, - [36] = { X = 44, Y = 724, Sheet = 3926305904 }, - [96] = { X = 804, Y = 904, Sheet = 3926326846 }, - [48] = { X = 368, Y = 56, Sheet = 3926311105 }, - }, - brightness_high = { - [72] = { X = 612, Y = 692, Sheet = 3926312257 }, - [36] = { X = 604, Y = 204, Sheet = 3926307971 }, - [96] = { X = 904, Y = 104, Sheet = 3926329330 }, - [48] = { X = 784, Y = 368, Sheet = 3926311105 }, - }, - mode_comment = { - [48] = { X = 56, Y = 576, Sheet = 3926309567 }, - [36] = { X = 404, Y = 724, Sheet = 3926305904 }, - [72] = { X = 536, Y = 384, Sheet = 3926319099 }, - [96] = { X = 904, Y = 404, Sheet = 3926334787 }, - }, - system_update_alt = { - [72] = { X = 612, Y = 460, Sheet = 3926316119 }, - [36] = { X = 564, Y = 444, Sheet = 3926305904 }, - [96] = { X = 704, Y = 4, Sheet = 3926321212 }, - [48] = { X = 680, Y = 784, Sheet = 3926307971 }, - }, - exposure_neg_2 = { - [72] = { X = 232, Y = 384, Sheet = 3926314806 }, - [36] = { X = 684, Y = 444, Sheet = 3926305904 }, - [96] = { X = 404, Y = 904, Sheet = 3926327588 }, - [48] = { X = 56, Y = 524, Sheet = 3926311105 }, - }, - file_download = { - [72] = { X = 536, Y = 612, Sheet = 3926316119 }, - [36] = { X = 844, Y = 444, Sheet = 3926305904 }, - [96] = { X = 504, Y = 904, Sheet = 3926327588 }, - [48] = { X = 784, Y = 4, Sheet = 3926312257 }, - }, - input = { - [72] = { X = 840, Y = 612, Sheet = 3926316119 }, - [36] = { X = 764, Y = 444, Sheet = 3926305904 }, - [96] = { X = 104, Y = 104, Sheet = 3926333840 }, - [48] = { X = 836, Y = 628, Sheet = 3926307971 }, - }, - call_made = { - [72] = { X = 384, Y = 236, Sheet = 3926312257 }, - [36] = { X = 764, Y = 84, Sheet = 3926307971 }, - [96] = { X = 704, Y = 704, Sheet = 3926329330 }, - [48] = { X = 212, Y = 836, Sheet = 3926311105 }, - }, - fiber_dvr = { - [72] = { X = 156, Y = 308, Sheet = 3926314806 }, - [36] = { X = 244, Y = 444, Sheet = 3926305904 }, - [96] = { X = 604, Y = 504, Sheet = 3926327588 }, - [48] = { X = 576, Y = 160, Sheet = 3926312257 }, - }, - phonelink = { - [72] = { X = 612, Y = 536, Sheet = 3926314806 }, - [36] = { X = 204, Y = 164, Sheet = 3926307971 }, - [96] = { X = 304, Y = 104, Sheet = 3926329330 }, - [48] = { X = 628, Y = 680, Sheet = 3926309567 }, - }, - fiber_pin = { - [72] = { X = 384, Y = 612, Sheet = 3926316119 }, - [36] = { X = 324, Y = 444, Sheet = 3926305904 }, - [96] = { X = 4, Y = 904, Sheet = 3926327588 }, - [48] = { X = 368, Y = 4, Sheet = 3926312257 }, - }, - videogame_asset = { - [48] = { X = 160, Y = 836, Sheet = 3926311105 }, - [36] = { X = 764, Y = 964, Sheet = 3926305904 }, - [72] = { X = 232, Y = 536, Sheet = 3926319099 }, - [96] = { X = 4, Y = 864, Sheet = 3926319099 }, - }, - important_devices = { - [72] = { X = 384, Y = 536, Sheet = 3926317787 }, - [36] = { X = 444, Y = 444, Sheet = 3926305904 }, - [96] = { X = 104, Y = 904, Sheet = 3926334787 }, - [48] = { X = 524, Y = 732, Sheet = 3926307971 }, - }, - mms = { - [48] = { X = 940, Y = 524, Sheet = 3926309567 }, - [36] = { X = 244, Y = 724, Sheet = 3926305904 }, - [72] = { X = 4, Y = 460, Sheet = 3926319099 }, - [96] = { X = 104, Y = 804, Sheet = 3926334787 }, - }, - airline_seat_flat_angled = { - [72] = { X = 916, Y = 536, Sheet = 3926314806 }, - [36] = { X = 764, Y = 364, Sheet = 3926307971 }, - [96] = { X = 204, Y = 104, Sheet = 3926328650 }, - [48] = { X = 940, Y = 316, Sheet = 3926311105 }, - }, - speaker_notes_off = { - [72] = { X = 536, Y = 312, Sheet = 3926312257 }, - [36] = { X = 484, Y = 884, Sheet = 3926305904 }, - [96] = { X = 504, Y = 604, Sheet = 3926319860 }, - [48] = { X = 784, Y = 940, Sheet = 3926309567 }, - }, - format_quote = { - [72] = { X = 840, Y = 4, Sheet = 3926314806 }, - [36] = { X = 604, Y = 204, Sheet = 3926305904 }, - [96] = { X = 704, Y = 504, Sheet = 3926327588 }, - [48] = { X = 524, Y = 56, Sheet = 3926312257 }, - }, - remove_shopping_cart = { - [72] = { X = 308, Y = 308, Sheet = 3926313458 }, - [36] = { X = 284, Y = 484, Sheet = 3926307971 }, - [96] = { X = 404, Y = 704, Sheet = 3926333840 }, - [48] = { X = 212, Y = 160, Sheet = 3926309567 }, - }, - tab_unselected = { - [72] = { X = 232, Y = 612, Sheet = 3926316119 }, - [36] = { X = 444, Y = 484, Sheet = 3926305904 }, - [96] = { X = 4, Y = 4, Sheet = 3926321212 }, - [48] = { X = 4, Y = 680, Sheet = 3926307971 }, - }, - sms = { - [72] = { X = 384, Y = 844, Sheet = 3926312257 }, - [36] = { X = 964, Y = 84, Sheet = 3926307971 }, - [96] = { X = 504, Y = 4, Sheet = 3926321212 }, - [48] = { X = 680, Y = 732, Sheet = 3926309567 }, - }, - insert_link = { - [72] = { X = 156, Y = 536, Sheet = 3926316119 }, - [36] = { X = 564, Y = 484, Sheet = 3926305904 }, - [96] = { X = 704, Y = 4, Sheet = 3926333840 }, - [48] = { X = 888, Y = 888, Sheet = 3926307971 }, - }, - featured_play_list = { - [72] = { X = 80, Y = 536, Sheet = 3926316119 }, - [36] = { X = 284, Y = 484, Sheet = 3926305904 }, - [96] = { X = 804, Y = 904, Sheet = 3926327588 }, - [48] = { X = 836, Y = 4, Sheet = 3926312257 }, - }, - bookmark_border = { - [72] = { X = 4, Y = 536, Sheet = 3926314806 }, - [36] = { X = 764, Y = 324, Sheet = 3926307971 }, - [96] = { X = 504, Y = 904, Sheet = 3926329330 }, - [48] = { X = 368, Y = 628, Sheet = 3926311105 }, - }, - format_italic = { - [72] = { X = 916, Y = 384, Sheet = 3926316119 }, - [36] = { X = 444, Y = 204, Sheet = 3926305904 }, - [96] = { X = 804, Y = 604, Sheet = 3926327588 }, - [48] = { X = 4, Y = 160, Sheet = 3926312257 }, - }, - invert_colors = { - [72] = { X = 80, Y = 688, Sheet = 3926316119 }, - [36] = { X = 44, Y = 484, Sheet = 3926305904 }, - [96] = { X = 4, Y = 204, Sheet = 3926333840 }, - [48] = { X = 836, Y = 732, Sheet = 3926307971 }, - }, - cloud_off = { - [72] = { X = 840, Y = 232, Sheet = 3926317787 }, - [36] = { X = 524, Y = 844, Sheet = 3926305904 }, - [96] = { X = 704, Y = 204, Sheet = 3926328650 }, - [48] = { X = 888, Y = 732, Sheet = 3926311105 }, - }, - battery_80 = { - [72] = { X = 612, Y = 916, Sheet = 3926313458 }, - [36] = { X = 364, Y = 404, Sheet = 3926307971 }, - [96] = { X = 104, Y = 604, Sheet = 3926328650 }, - [48] = { X = 264, Y = 732, Sheet = 3926311105 }, - }, - feedback = { - [72] = { X = 916, Y = 612, Sheet = 3926316119 }, - [36] = { X = 84, Y = 484, Sheet = 3926305904 }, - [96] = { X = 604, Y = 704, Sheet = 3926327588 }, - [48] = { X = 732, Y = 4, Sheet = 3926312257 }, - }, - timer_off = { - [72] = { X = 536, Y = 80, Sheet = 3926316119 }, - [36] = { X = 544, Y = 4, Sheet = 3926305904 }, - [96] = { X = 864, Y = 764, Sheet = 3926319099 }, - [48] = { X = 888, Y = 420, Sheet = 3926311105 }, - }, - landscape = { - [72] = { X = 308, Y = 460, Sheet = 3926314806 }, - [36] = { X = 124, Y = 444, Sheet = 3926305904 }, - [96] = { X = 604, Y = 404, Sheet = 3926333840 }, - [48] = { X = 316, Y = 108, Sheet = 3926309567 }, - }, - fiber_manual_record = { - [72] = { X = 460, Y = 308, Sheet = 3926314806 }, - [36] = { X = 204, Y = 484, Sheet = 3926305904 }, - [96] = { X = 4, Y = 604, Sheet = 3926327588 }, - [48] = { X = 732, Y = 56, Sheet = 3926312257 }, - }, - directions_car = { - [36] = { X = 724, Y = 524, Sheet = 3926305904 }, - [24] = { X = 340, Y = 4, Size = 24, Sheet = 3926305904 }, - [96] = { X = 804, Y = 204, Sheet = 3926321212 }, - [72] = { X = 4, Y = 4, Sheet = 3926319099 }, - [48] = { X = 472, Y = 680, Sheet = 3926311105 }, - }, - play_circle_filled_white = { - [72] = { X = 460, Y = 156, Sheet = 3926314806 }, - [36] = { X = 884, Y = 244, Sheet = 3926307971 }, - [96] = { X = 104, Y = 4, Sheet = 3926329330 }, - [48] = { X = 472, Y = 576, Sheet = 3926309567 }, - }, - pageview = { - [72] = { X = 80, Y = 464, Sheet = 3926312257 }, - [36] = { X = 924, Y = 964, Sheet = 3926305904 }, - [96] = { X = 204, Y = 504, Sheet = 3926330123 }, - [48] = { X = 680, Y = 836, Sheet = 3926309567 }, - }, - dock = { - [72] = { X = 536, Y = 840, Sheet = 3926316119 }, - [36] = { X = 84, Y = 444, Sheet = 3926305904 }, - [96] = { X = 804, Y = 404, Sheet = 3926321212 }, - [48] = { X = 784, Y = 628, Sheet = 3926311105 }, - }, - pause_circle_filled = { - [72] = { X = 688, Y = 540, Sheet = 3926312257 }, - [36] = { X = 524, Y = 884, Sheet = 3926305904 }, - [96] = { X = 604, Y = 804, Sheet = 3926330123 }, - [48] = { X = 472, Y = 940, Sheet = 3926309567 }, - }, - build = { - [72] = { X = 308, Y = 464, Sheet = 3926312257 }, - [36] = { X = 964, Y = 4, Sheet = 3926307971 }, - [96] = { X = 904, Y = 804, Sheet = 3926329330 }, - [48] = { X = 212, Y = 108, Sheet = 3926311105 }, - }, - dvr = { - [72] = { X = 232, Y = 156, Sheet = 3926317787 }, - [36] = { X = 4, Y = 404, Sheet = 3926305904 }, - [96] = { X = 204, Y = 504, Sheet = 3926326846 }, - [48] = { X = 628, Y = 888, Sheet = 3926311105 }, - }, - wb_auto = { - [72] = { X = 460, Y = 764, Sheet = 3926313458 }, - [36] = { X = 724, Y = 404, Sheet = 3926307971 }, - [96] = { X = 104, Y = 804, Sheet = 3926319860 }, - [48] = { X = 524, Y = 940, Sheet = 3926311105 }, - }, - filter_6 = { - [72] = { X = 688, Y = 688, Sheet = 3926317787 }, - [36] = { X = 524, Y = 124, Sheet = 3926305904 }, - [96] = { X = 104, Y = 204, Sheet = 3926327588 }, - [48] = { X = 680, Y = 420, Sheet = 3926311105 }, - }, - filter_vintage = { - [72] = { X = 536, Y = 460, Sheet = 3926317787 }, - [36] = { X = 524, Y = 804, Sheet = 3926305904 }, - [96] = { X = 504, Y = 804, Sheet = 3926327588 }, - [48] = { X = 628, Y = 108, Sheet = 3926312257 }, - }, - phone = { - [72] = { X = 80, Y = 920, Sheet = 3926312257 }, - [36] = { X = 724, Y = 4, Sheet = 3926307971 }, - [96] = { X = 604, Y = 204, Sheet = 3926329330 }, - [48] = { X = 888, Y = 576, Sheet = 3926309567 }, - }, - chat = { - [48] = { X = 888, Y = 784, Sheet = 3926311105 }, - [36] = { X = 564, Y = 564, Sheet = 3926305904 }, - [72] = { X = 460, Y = 612, Sheet = 3926319099 }, - [96] = { X = 604, Y = 604, Sheet = 3926329330 }, - }, - mode_edit = { - [48] = { X = 836, Y = 524, Sheet = 3926309567 }, - [36] = { X = 324, Y = 604, Sheet = 3926305904 }, - [72] = { X = 840, Y = 688, Sheet = 3926319099 }, - [96] = { X = 604, Y = 104, Sheet = 3926334787 }, - }, - visibility_off = { - [72] = { X = 840, Y = 540, Sheet = 3926312257 }, - [36] = { X = 564, Y = 44, Sheet = 3926307971 }, - [96] = { X = 604, Y = 804, Sheet = 3926319860 }, - [48] = { X = 472, Y = 4, Sheet = 3926311105 }, - }, - toll = { - [72] = { X = 80, Y = 156, Sheet = 3926317787 }, - [36] = { X = 844, Y = 844, Sheet = 3926305904 }, - [96] = { X = 804, Y = 904, Sheet = 3926321212 }, - [48] = { X = 940, Y = 56, Sheet = 3926312257 }, - }, - camera = { - [72] = { X = 80, Y = 536, Sheet = 3926313458 }, - [36] = { X = 484, Y = 964, Sheet = 3926305904 }, - [96] = { X = 604, Y = 204, Sheet = 3926328650 }, - [48] = { X = 576, Y = 108, Sheet = 3926311105 }, - }, - turned_in = { - [72] = { X = 764, Y = 688, Sheet = 3926316119 }, - [36] = { X = 284, Y = 404, Sheet = 3926305904 }, - [96] = { X = 204, Y = 704, Sheet = 3926321212 }, - [48] = { X = 576, Y = 524, Sheet = 3926311105 }, - }, - child_friendly = { - [48] = { X = 524, Y = 108, Sheet = 3926311105 }, - [36] = { X = 44, Y = 924, Sheet = 3926305904 }, - [72] = { X = 156, Y = 308, Sheet = 3926319099 }, - [96] = { X = 104, Y = 704, Sheet = 3926329330 }, - }, - swap_calls = { - [72] = { X = 308, Y = 156, Sheet = 3926316119 }, - [36] = { X = 324, Y = 404, Sheet = 3926305904 }, - [96] = { X = 504, Y = 304, Sheet = 3926319860 }, - [48] = { X = 264, Y = 160, Sheet = 3926309567 }, - }, - av_timer = { - [72] = { X = 308, Y = 840, Sheet = 3926313458 }, - [36] = { X = 324, Y = 84, Sheet = 3926307971 }, - [96] = { X = 504, Y = 204, Sheet = 3926327588 }, - [48] = { X = 940, Y = 836, Sheet = 3926311105 }, - }, - arrow_drop_down_circle = { - [72] = { X = 80, Y = 308, Sheet = 3926313458 }, - [36] = { X = 44, Y = 524, Sheet = 3926307971 }, - [96] = { X = 604, Y = 404, Sheet = 3926327588 }, - [48] = { X = 784, Y = 108, Sheet = 3926312257 }, - }, - lightbulb_outline = { - [72] = { X = 232, Y = 156, Sheet = 3926316119 }, - [36] = { X = 764, Y = 364, Sheet = 3926305904 }, - [96] = { X = 404, Y = 404, Sheet = 3926333840 }, - [48] = { X = 316, Y = 160, Sheet = 3926309567 }, - }, - report_problem = { - [72] = { X = 232, Y = 384, Sheet = 3926313458 }, - [36] = { X = 644, Y = 484, Sheet = 3926307971 }, - [96] = { X = 4, Y = 804, Sheet = 3926333840 }, - [48] = { X = 576, Y = 160, Sheet = 3926309567 }, - }, - linked_camera = { - [72] = { X = 460, Y = 536, Sheet = 3926316119 }, - [36] = { X = 244, Y = 404, Sheet = 3926305904 }, - [96] = { X = 204, Y = 404, Sheet = 3926335698 }, - [48] = { X = 784, Y = 784, Sheet = 3926309567 }, - }, - panorama_fish_eye = { - [72] = { X = 308, Y = 536, Sheet = 3926313458 }, - [36] = { X = 324, Y = 964, Sheet = 3926305904 }, - [96] = { X = 804, Y = 804, Sheet = 3926330123 }, - [48] = { X = 264, Y = 940, Sheet = 3926309567 }, - }, - rate_review = { - [72] = { X = 688, Y = 840, Sheet = 3926313458 }, - [36] = { X = 124, Y = 404, Sheet = 3926307971 }, - [96] = { X = 304, Y = 604, Sheet = 3926333840 }, - [48] = { X = 472, Y = 160, Sheet = 3926309567 }, - }, - drag_handle = { - [72] = { X = 688, Y = 688, Sheet = 3926316119 }, - [36] = { X = 964, Y = 364, Sheet = 3926305904 }, - [96] = { X = 4, Y = 504, Sheet = 3926326846 }, - [48] = { X = 264, Y = 316, Sheet = 3926309567 }, - }, - edit_location = { - [72] = { X = 916, Y = 80, Sheet = 3926316119 }, - [36] = { X = 844, Y = 404, Sheet = 3926305904 }, - [96] = { X = 304, Y = 504, Sheet = 3926326846 }, - [48] = { X = 524, Y = 888, Sheet = 3926311105 }, - }, - local_drink = { - [72] = { X = 156, Y = 916, Sheet = 3926316119 }, - [36] = { X = 964, Y = 524, Sheet = 3926305904 }, - [96] = { X = 204, Y = 304, Sheet = 3926334787 }, - [48] = { X = 212, Y = 108, Sheet = 3926309567 }, - }, - signal_cellular_4_bar = { - [72] = { X = 840, Y = 840, Sheet = 3926314806 }, - [36] = { X = 204, Y = 364, Sheet = 3926307971 }, - [96] = { X = 704, Y = 604, Sheet = 3926319860 }, - [48] = { X = 496, Y = 524, Sheet = 3926307971 }, - }, - poll = { - [72] = { X = 840, Y = 688, Sheet = 3926314806 }, - [36] = { X = 484, Y = 364, Sheet = 3926305904 }, - [96] = { X = 304, Y = 404, Sheet = 3926329330 }, - [48] = { X = 420, Y = 368, Sheet = 3926309567 }, - }, - directions_railway = { - [48] = { X = 940, Y = 680, Sheet = 3926311105 }, - [36] = { X = 524, Y = 524, Sheet = 3926305904 }, - [72] = { X = 80, Y = 80, Sheet = 3926319099 }, - [96] = { X = 204, Y = 304, Sheet = 3926321212 }, - }, - format_shapes = { - [72] = { X = 308, Y = 232, Sheet = 3926316119 }, - [36] = { X = 284, Y = 844, Sheet = 3926305904 }, - [96] = { X = 4, Y = 504, Sheet = 3926327588 }, - [48] = { X = 316, Y = 836, Sheet = 3926307971 }, - }, - ev_station = { - [72] = { X = 232, Y = 840, Sheet = 3926316119 }, - [36] = { X = 884, Y = 44, Sheet = 3926305904 }, - [96] = { X = 704, Y = 604, Sheet = 3926326846 }, - [48] = { X = 836, Y = 940, Sheet = 3926311105 }, - }, - forward_5 = { - [72] = { X = 384, Y = 612, Sheet = 3926317787 }, - [36] = { X = 444, Y = 244, Sheet = 3926305904 }, - [96] = { X = 204, Y = 604, Sheet = 3926327588 }, - [48] = { X = 680, Y = 940, Sheet = 3926307971 }, - }, -} diff --git a/src/IconLabel/Spritesheet/Sheet11.lua b/src/IconLabel/Spritesheet/Sheet11.lua deleted file mode 100644 index 7e09d19a..00000000 --- a/src/IconLabel/Spritesheet/Sheet11.lua +++ /dev/null @@ -1,503 +0,0 @@ -return { - leak_remove = { - [72] = { X = 80, Y = 156, Sheet = 3926316119 }, - [36] = { X = 84, Y = 124, Sheet = 3926305904 }, - [96] = { X = 604, Y = 4, Sheet = 3926333840 }, - [48] = { X = 108, Y = 4, Sheet = 3926309567 }, - }, - surround_sound = { - [72] = { X = 4, Y = 916, Sheet = 3926316119 }, - [36] = { X = 684, Y = 404, Sheet = 3926305904 }, - [96] = { X = 804, Y = 604, Sheet = 3926321212 }, - [48] = { X = 56, Y = 160, Sheet = 3926309567 }, - }, - straighten = { - [72] = { X = 80, Y = 80, Sheet = 3926317787 }, - [36] = { X = 164, Y = 684, Sheet = 3926305904 }, - [96] = { X = 4, Y = 4, Sheet = 3926319860 }, - [48] = { X = 212, Y = 420, Sheet = 3926309567 }, - }, - fitness_center = { - [72] = { X = 688, Y = 916, Sheet = 3926317787 }, - [36] = { X = 444, Y = 404, Sheet = 3926305904 }, - [96] = { X = 904, Y = 404, Sheet = 3926327588 }, - [48] = { X = 888, Y = 212, Sheet = 3926311105 }, - }, - terrain = { - [72] = { X = 232, Y = 916, Sheet = 3926317787 }, - [36] = { X = 644, Y = 844, Sheet = 3926305904 }, - [96] = { X = 404, Y = 864, Sheet = 3926319099 }, - [48] = { X = 420, Y = 628, Sheet = 3926307971 }, - }, - crop_rotate = { - [72] = { X = 308, Y = 460, Sheet = 3926317787 }, - [36] = { X = 564, Y = 644, Sheet = 3926305904 }, - [96] = { X = 804, Y = 104, Sheet = 3926326846 }, - [48] = { X = 628, Y = 108, Sheet = 3926311105 }, - }, - control_point_duplicate = { - [48] = { X = 420, Y = 4, Sheet = 3926311105 }, - [36] = { X = 364, Y = 724, Sheet = 3926305904 }, - [72] = { X = 460, Y = 536, Sheet = 3926319099 }, - [96] = { X = 804, Y = 804, Sheet = 3926326846 }, - }, - alarm = { - [72] = { X = 80, Y = 156, Sheet = 3926313458 }, - [36] = { X = 604, Y = 404, Sheet = 3926307971 }, - [96] = { X = 904, Y = 704, Sheet = 3926328650 }, - [48] = { X = 732, Y = 368, Sheet = 3926311105 }, - }, - format_color_fill = { - [72] = { X = 840, Y = 612, Sheet = 3926317787 }, - [36] = { X = 244, Y = 244, Sheet = 3926305904 }, - [96] = { X = 904, Y = 304, Sheet = 3926326846 }, - [48] = { X = 628, Y = 420, Sheet = 3926311105 }, - }, - store = { - [72] = { X = 80, Y = 384, Sheet = 3926317787 }, - [36] = { X = 564, Y = 724, Sheet = 3926305904 }, - [96] = { X = 104, Y = 204, Sheet = 3926321212 }, - [48] = { X = 836, Y = 784, Sheet = 3926309567 }, - }, - desktop_mac = { - [48] = { X = 4, Y = 940, Sheet = 3926311105 }, - [36] = { X = 684, Y = 684, Sheet = 3926305904 }, - [72] = { X = 612, Y = 156, Sheet = 3926319099 }, - [96] = { X = 504, Y = 104, Sheet = 3926326846 }, - }, - dashboard = { - [72] = { X = 460, Y = 384, Sheet = 3926317787 }, - [36] = { X = 44, Y = 644, Sheet = 3926305904 }, - [96] = { X = 904, Y = 4, Sheet = 3926326846 }, - [48] = { X = 940, Y = 160, Sheet = 3926311105 }, - }, - signal_cellular_connected_no_internet_3_bar = { - [72] = { X = 840, Y = 764, Sheet = 3926313458 }, - [36] = { X = 244, Y = 404, Sheet = 3926307971 }, - [96] = { X = 104, Y = 904, Sheet = 3926321212 }, - [48] = { X = 784, Y = 628, Sheet = 3926307971 }, - }, - content_paste = { - [48] = { X = 212, Y = 4, Sheet = 3926311105 }, - [36] = { X = 484, Y = 644, Sheet = 3926305904 }, - [72] = { X = 80, Y = 612, Sheet = 3926319099 }, - [96] = { X = 904, Y = 804, Sheet = 3926326846 }, - }, - turned_in_not = { - [72] = { X = 156, Y = 156, Sheet = 3926316119 }, - [36] = { X = 604, Y = 404, Sheet = 3926305904 }, - [96] = { X = 404, Y = 304, Sheet = 3926319860 }, - [48] = { X = 160, Y = 888, Sheet = 3926311105 }, - }, - camera_front = { - [72] = { X = 4, Y = 236, Sheet = 3926312257 }, - [36] = { X = 684, Y = 884, Sheet = 3926305904 }, - [96] = { X = 804, Y = 404, Sheet = 3926328650 }, - [48] = { X = 420, Y = 160, Sheet = 3926311105 }, - }, - hdr_strong = { - [72] = { X = 156, Y = 764, Sheet = 3926317787 }, - [36] = { X = 684, Y = 844, Sheet = 3926305904 }, - [96] = { X = 704, Y = 504, Sheet = 3926334787 }, - [48] = { X = 652, Y = 524, Sheet = 3926307971 }, - }, - touch_app = { - [72] = { X = 80, Y = 612, Sheet = 3926317787 }, - [36] = { X = 84, Y = 204, Sheet = 3926305904 }, - [96] = { X = 504, Y = 504, Sheet = 3926321212 }, - [48] = { X = 420, Y = 368, Sheet = 3926311105 }, - }, - signal_cellular_3_bar = { - [72] = { X = 688, Y = 844, Sheet = 3926312257 }, - [36] = { X = 124, Y = 164, Sheet = 3926307971 }, - [96] = { X = 404, Y = 804, Sheet = 3926319860 }, - [48] = { X = 964, Y = 524, Sheet = 3926307971 }, - }, - crop_free = { - [72] = { X = 80, Y = 232, Sheet = 3926317787 }, - [36] = { X = 684, Y = 724, Sheet = 3926305904 }, - [96] = { X = 904, Y = 404, Sheet = 3926326846 }, - [48] = { X = 576, Y = 212, Sheet = 3926311105 }, - }, - view_array = { - [72] = { X = 156, Y = 4, Sheet = 3926317787 }, - [36] = { X = 244, Y = 844, Sheet = 3926305904 }, - [96] = { X = 804, Y = 604, Sheet = 3926319860 }, - [48] = { X = 160, Y = 784, Sheet = 3926311105 }, - }, - timer_10 = { - [72] = { X = 308, Y = 612, Sheet = 3926317787 }, - [36] = { X = 164, Y = 244, Sheet = 3926305904 }, - [96] = { X = 4, Y = 504, Sheet = 3926319860 }, - [48] = { X = 472, Y = 420, Sheet = 3926311105 }, - }, - move_to_inbox = { - [48] = { X = 732, Y = 680, Sheet = 3926309567 }, - [36] = { X = 604, Y = 924, Sheet = 3926305904 }, - [72] = { X = 156, Y = 536, Sheet = 3926319099 }, - [96] = { X = 304, Y = 404, Sheet = 3926334787 }, - }, - clear_all = { - [72] = { X = 232, Y = 384, Sheet = 3926317787 }, - [36] = { X = 484, Y = 764, Sheet = 3926305904 }, - [96] = { X = 704, Y = 604, Sheet = 3926329330 }, - [48] = { X = 472, Y = 472, Sheet = 3926311105 }, - }, - headset = { - [72] = { X = 460, Y = 460, Sheet = 3926317787 }, - [36] = { X = 644, Y = 804, Sheet = 3926305904 }, - [96] = { X = 404, Y = 904, Sheet = 3926334787 }, - [48] = { X = 212, Y = 576, Sheet = 3926307971 }, - }, - wb_sunny = { - [72] = { X = 384, Y = 384, Sheet = 3926313458 }, - [36] = { X = 364, Y = 524, Sheet = 3926307971 }, - [96] = { X = 504, Y = 104, Sheet = 3926321212 }, - [48] = { X = 420, Y = 576, Sheet = 3926311105 }, - }, - euro_symbol = { - [72] = { X = 80, Y = 764, Sheet = 3926316119 }, - [36] = { X = 724, Y = 84, Sheet = 3926305904 }, - [96] = { X = 104, Y = 604, Sheet = 3926326846 }, - [48] = { X = 784, Y = 940, Sheet = 3926311105 }, - }, - people = { - [36] = { X = 884, Y = 204, Sheet = 3926307971 }, - [24] = { X = 144, Y = 4, Size = 24, Sheet = 3926305904 }, - [96] = { X = 304, Y = 804, Sheet = 3926330123 }, - [72] = { X = 764, Y = 312, Sheet = 3926312257 }, - [48] = { X = 4, Y = 940, Sheet = 3926309567 }, - }, - hourglass_full = { - [72] = { X = 232, Y = 536, Sheet = 3926317787 }, - [36] = { X = 804, Y = 164, Sheet = 3926305904 }, - [96] = { X = 804, Y = 504, Sheet = 3926334787 }, - [48] = { X = 472, Y = 680, Sheet = 3926307971 }, - }, - collections_bookmark = { - [72] = { X = 536, Y = 232, Sheet = 3926317787 }, - [36] = { X = 204, Y = 804, Sheet = 3926305904 }, - [96] = { X = 504, Y = 204, Sheet = 3926328650 }, - [48] = { X = 108, Y = 784, Sheet = 3926311105 }, - }, - movie_filter = { - [72] = { X = 460, Y = 308, Sheet = 3926317787 }, - [36] = { X = 124, Y = 964, Sheet = 3926305904 }, - [96] = { X = 804, Y = 204, Sheet = 3926334787 }, - [48] = { X = 264, Y = 680, Sheet = 3926309567 }, - }, - rowing = { - [72] = { X = 916, Y = 156, Sheet = 3926313458 }, - [36] = { X = 604, Y = 444, Sheet = 3926307971 }, - [96] = { X = 104, Y = 4, Sheet = 3926330123 }, - [48] = { X = 576, Y = 836, Sheet = 3926307971 }, - }, - local_convenience_store = { - [72] = { X = 308, Y = 840, Sheet = 3926316119 }, - [36] = { X = 44, Y = 564, Sheet = 3926305904 }, - [96] = { X = 304, Y = 404, Sheet = 3926335698 }, - [48] = { X = 732, Y = 108, Sheet = 3926309567 }, - }, - headset_mic = { - [72] = { X = 4, Y = 840, Sheet = 3926317787 }, - [36] = { X = 884, Y = 844, Sheet = 3926305904 }, - [96] = { X = 604, Y = 904, Sheet = 3926334787 }, - [48] = { X = 4, Y = 576, Sheet = 3926307971 }, - }, - local_hospital = { - [48] = { X = 836, Y = 420, Sheet = 3926309567 }, - [36] = { X = 484, Y = 524, Sheet = 3926305904 }, - [72] = { X = 232, Y = 156, Sheet = 3926319099 }, - [96] = { X = 504, Y = 304, Sheet = 3926334787 }, - }, - shop_two = { - [72] = { X = 384, Y = 768, Sheet = 3926312257 }, - [36] = { X = 4, Y = 124, Sheet = 3926307971 }, - [96] = { X = 304, Y = 404, Sheet = 3926330123 }, - [48] = { X = 576, Y = 784, Sheet = 3926307971 }, - }, - photo_album = { - [72] = { X = 840, Y = 536, Sheet = 3926314806 }, - [36] = { X = 324, Y = 164, Sheet = 3926307971 }, - [96] = { X = 304, Y = 4, Sheet = 3926329330 }, - [48] = { X = 784, Y = 680, Sheet = 3926309567 }, - }, - swap_vertical_circle = { - [72] = { X = 460, Y = 460, Sheet = 3926316119 }, - [36] = { X = 44, Y = 124, Sheet = 3926305904 }, - [96] = { X = 404, Y = 104, Sheet = 3926319860 }, - [48] = { X = 940, Y = 56, Sheet = 3926309567 }, - }, - open_in_new = { - [36] = { X = 404, Y = 964, Sheet = 3926305904 }, - [24] = { X = 396, Y = 4, Size = 24, Sheet = 3926305904 }, - [96] = { X = 804, Y = 604, Sheet = 3926330123 }, - [72] = { X = 80, Y = 616, Sheet = 3926312257 }, - [48] = { X = 836, Y = 836, Sheet = 3926309567 }, - }, - fingerprint = { - [72] = { X = 764, Y = 916, Sheet = 3926317787 }, - [36] = { X = 164, Y = 844, Sheet = 3926305904 }, - [96] = { X = 204, Y = 104, Sheet = 3926327588 }, - [48] = { X = 56, Y = 316, Sheet = 3926311105 }, - }, - thumbs_up_down = { - [72] = { X = 4, Y = 460, Sheet = 3926316119 }, - [36] = { X = 4, Y = 204, Sheet = 3926305904 }, - [96] = { X = 304, Y = 864, Sheet = 3926319099 }, - [48] = { X = 940, Y = 888, Sheet = 3926307971 }, - }, - domain = { - [72] = { X = 916, Y = 536, Sheet = 3926316119 }, - [36] = { X = 804, Y = 404, Sheet = 3926305904 }, - [96] = { X = 304, Y = 404, Sheet = 3926321212 }, - [48] = { X = 524, Y = 628, Sheet = 3926311105 }, - }, - local_grocery_store = { - [48] = { X = 680, Y = 420, Sheet = 3926309567 }, - [36] = { X = 4, Y = 524, Sheet = 3926305904 }, - [72] = { X = 80, Y = 156, Sheet = 3926319099 }, - [96] = { X = 704, Y = 204, Sheet = 3926334787 }, - }, - merge_type = { - [72] = { X = 536, Y = 4, Sheet = 3926317787 }, - [36] = { X = 484, Y = 724, Sheet = 3926305904 }, - [96] = { X = 204, Y = 104, Sheet = 3926334787 }, - [48] = { X = 888, Y = 472, Sheet = 3926309567 }, - }, - flash_off = { - [72] = { X = 536, Y = 688, Sheet = 3926317787 }, - [36] = { X = 964, Y = 804, Sheet = 3926305904 }, - [96] = { X = 604, Y = 304, Sheet = 3926326846 }, - [48] = { X = 212, Y = 368, Sheet = 3926311105 }, - }, - view_column = { - [48] = { X = 212, Y = 160, Sheet = 3926311105 }, - [36] = { X = 204, Y = 764, Sheet = 3926305904 }, - [72] = { X = 4, Y = 232, Sheet = 3926319099 }, - [96] = { X = 504, Y = 904, Sheet = 3926319860 }, - }, - control_point = { - [48] = { X = 264, Y = 108, Sheet = 3926311105 }, - [36] = { X = 444, Y = 724, Sheet = 3926305904 }, - [72] = { X = 688, Y = 536, Sheet = 3926319099 }, - [96] = { X = 304, Y = 904, Sheet = 3926326846 }, - }, - stop_screen_share = { - [48] = { X = 212, Y = 576, Sheet = 3926309567 }, - [36] = { X = 884, Y = 764, Sheet = 3926305904 }, - [72] = { X = 156, Y = 612, Sheet = 3926319099 }, - [96] = { X = 604, Y = 704, Sheet = 3926321212 }, - }, - email = { - [36] = { X = 364, Y = 84, Sheet = 3926305904 }, - [24] = { X = 172, Y = 4, Size = 24, Sheet = 3926305904 }, - [96] = { X = 604, Y = 504, Sheet = 3926326846 }, - [72] = { X = 688, Y = 156, Sheet = 3926316119 }, - [48] = { X = 940, Y = 524, Sheet = 3926311105 }, - }, - signal_cellular_connected_no_internet_1_bar = { - [72] = { X = 460, Y = 80, Sheet = 3926314806 }, - [36] = { X = 44, Y = 324, Sheet = 3926305904 }, - [96] = { X = 504, Y = 704, Sheet = 3926321212 }, - [48] = { X = 732, Y = 732, Sheet = 3926307971 }, - }, - chat_bubble_outline = { - [48] = { X = 576, Y = 784, Sheet = 3926311105 }, - [36] = { X = 404, Y = 564, Sheet = 3926305904 }, - [72] = { X = 4, Y = 156, Sheet = 3926319099 }, - [96] = { X = 504, Y = 404, Sheet = 3926328650 }, - }, - fullscreen = { - [72] = { X = 80, Y = 308, Sheet = 3926316119 }, - [36] = { X = 724, Y = 204, Sheet = 3926305904 }, - [96] = { X = 404, Y = 604, Sheet = 3926327588 }, - [48] = { X = 576, Y = 732, Sheet = 3926307971 }, - }, - enhanced_encryption = { - [72] = { X = 916, Y = 156, Sheet = 3926316119 }, - [36] = { X = 284, Y = 124, Sheet = 3926305904 }, - [96] = { X = 404, Y = 704, Sheet = 3926326846 }, - [48] = { X = 368, Y = 888, Sheet = 3926311105 }, - }, - subdirectory_arrow_left = { - [48] = { X = 628, Y = 264, Sheet = 3926309567 }, - [36] = { X = 364, Y = 524, Sheet = 3926305904 }, - [72] = { X = 232, Y = 612, Sheet = 3926319099 }, - [96] = { X = 504, Y = 604, Sheet = 3926321212 }, - }, - local_shipping = { - [48] = { X = 108, Y = 472, Sheet = 3926309567 }, - [36] = { X = 124, Y = 604, Sheet = 3926305904 }, - [72] = { X = 612, Y = 232, Sheet = 3926319099 }, - [96] = { X = 204, Y = 4, Sheet = 3926335698 }, - }, - gif = { - [72] = { X = 80, Y = 4, Sheet = 3926316119 }, - [36] = { X = 824, Y = 4, Sheet = 3926305904 }, - [96] = { X = 404, Y = 504, Sheet = 3926334787 }, - [48] = { X = 680, Y = 628, Sheet = 3926307971 }, - }, - payment = { - [72] = { X = 536, Y = 388, Sheet = 3926312257 }, - [36] = { X = 684, Y = 124, Sheet = 3926307971 }, - [96] = { X = 504, Y = 104, Sheet = 3926330123 }, - [48] = { X = 836, Y = 940, Sheet = 3926309567 }, - }, - gamepad = { - [72] = { X = 764, Y = 4, Sheet = 3926316119 }, - [36] = { X = 784, Y = 4, Sheet = 3926305904 }, - [96] = { X = 804, Y = 604, Sheet = 3926334787 }, - [48] = { X = 212, Y = 264, Sheet = 3926309567 }, - }, - content_cut = { - [48] = { X = 264, Y = 4, Sheet = 3926311105 }, - [36] = { X = 364, Y = 564, Sheet = 3926305904 }, - [72] = { X = 688, Y = 688, Sheet = 3926319099 }, - [96] = { X = 804, Y = 704, Sheet = 3926326846 }, - }, - looks_5 = { - [72] = { X = 232, Y = 232, Sheet = 3926317787 }, - [36] = { X = 164, Y = 644, Sheet = 3926305904 }, - [96] = { X = 104, Y = 4, Sheet = 3926335698 }, - [48] = { X = 472, Y = 368, Sheet = 3926309567 }, - }, - image = { - [72] = { X = 460, Y = 536, Sheet = 3926317787 }, - [36] = { X = 764, Y = 124, Sheet = 3926305904 }, - [96] = { X = 804, Y = 804, Sheet = 3926334787 }, - [48] = { X = 888, Y = 628, Sheet = 3926309567 }, - }, - location_city = { - [48] = { X = 680, Y = 212, Sheet = 3926309567 }, - [36] = { X = 44, Y = 524, Sheet = 3926305904 }, - [72] = { X = 460, Y = 232, Sheet = 3926319099 }, - [96] = { X = 304, Y = 204, Sheet = 3926335698 }, - }, - stars = { - [48] = { X = 316, Y = 680, Sheet = 3926309567 }, - [36] = { X = 364, Y = 844, Sheet = 3926305904 }, - [72] = { X = 916, Y = 384, Sheet = 3926319099 }, - [96] = { X = 704, Y = 704, Sheet = 3926319860 }, - }, - get_app = { - [72] = { X = 536, Y = 4, Sheet = 3926316119 }, - [36] = { X = 744, Y = 4, Sheet = 3926305904 }, - [96] = { X = 104, Y = 604, Sheet = 3926334787 }, - [48] = { X = 524, Y = 680, Sheet = 3926307971 }, - }, - pause_circle_outline = { - [72] = { X = 688, Y = 464, Sheet = 3926312257 }, - [36] = { X = 604, Y = 884, Sheet = 3926305904 }, - [96] = { X = 104, Y = 804, Sheet = 3926330123 }, - [48] = { X = 368, Y = 940, Sheet = 3926309567 }, - }, - monochrome_photos = { - [72] = { X = 916, Y = 232, Sheet = 3926317787 }, - [36] = { X = 884, Y = 924, Sheet = 3926305904 }, - [96] = { X = 104, Y = 504, Sheet = 3926334787 }, - [48] = { X = 680, Y = 472, Sheet = 3926309567 }, - }, - textsms = { - [72] = { X = 612, Y = 384, Sheet = 3926316119 }, - [36] = { X = 624, Y = 4, Sheet = 3926305904 }, - [96] = { X = 504, Y = 804, Sheet = 3926319860 }, - [48] = { X = 732, Y = 576, Sheet = 3926307971 }, - }, - notifications_none = { - [48] = { X = 420, Y = 784, Sheet = 3926309567 }, - [36] = { X = 964, Y = 724, Sheet = 3926305904 }, - [72] = { X = 232, Y = 4, Sheet = 3926319099 }, - [96] = { X = 104, Y = 904, Sheet = 3926330123 }, - }, - announcement = { - [72] = { X = 460, Y = 840, Sheet = 3926313458 }, - [36] = { X = 244, Y = 444, Sheet = 3926307971 }, - [96] = { X = 304, Y = 804, Sheet = 3926328650 }, - [48] = { X = 784, Y = 420, Sheet = 3926311105 }, - }, - flight_takeoff = { - [72] = { X = 4, Y = 80, Sheet = 3926316119 }, - [36] = { X = 684, Y = 44, Sheet = 3926305904 }, - [96] = { X = 804, Y = 204, Sheet = 3926326846 }, - [48] = { X = 576, Y = 316, Sheet = 3926311105 }, - }, - markunread = { - [72] = { X = 80, Y = 4, Sheet = 3926317787 }, - [36] = { X = 484, Y = 684, Sheet = 3926305904 }, - [96] = { X = 104, Y = 104, Sheet = 3926334787 }, - [48] = { X = 836, Y = 472, Sheet = 3926309567 }, - }, - airport_shuttle = { - [72] = { X = 4, Y = 764, Sheet = 3926314806 }, - [36] = { X = 204, Y = 324, Sheet = 3926305904 }, - [96] = { X = 904, Y = 404, Sheet = 3926328650 }, - [48] = { X = 316, Y = 420, Sheet = 3926311105 }, - }, - dialpad = { - [48] = { X = 680, Y = 680, Sheet = 3926311105 }, - [36] = { X = 44, Y = 604, Sheet = 3926305904 }, - [72] = { X = 308, Y = 764, Sheet = 3926319099 }, - [96] = { X = 604, Y = 704, Sheet = 3926326846 }, - }, - format_line_spacing = { - [72] = { X = 840, Y = 232, Sheet = 3926316119 }, - [36] = { X = 444, Y = 44, Sheet = 3926305904 }, - [96] = { X = 304, Y = 704, Sheet = 3926327588 }, - [48] = { X = 784, Y = 56, Sheet = 3926312257 }, - }, - replay_10 = { - [72] = { X = 232, Y = 4, Sheet = 3926313458 }, - [36] = { X = 964, Y = 284, Sheet = 3926307971 }, - [96] = { X = 904, Y = 804, Sheet = 3926333840 }, - [48] = { X = 732, Y = 56, Sheet = 3926309567 }, - }, - directions_run = { - [48] = { X = 160, Y = 680, Sheet = 3926311105 }, - [36] = { X = 924, Y = 684, Sheet = 3926305904 }, - [72] = { X = 156, Y = 80, Sheet = 3926319099 }, - [96] = { X = 504, Y = 304, Sheet = 3926321212 }, - }, - filter_8 = { - [72] = { X = 4, Y = 688, Sheet = 3926317787 }, - [36] = { X = 884, Y = 164, Sheet = 3926305904 }, - [96] = { X = 804, Y = 104, Sheet = 3926327588 }, - [48] = { X = 56, Y = 368, Sheet = 3926311105 }, - }, - notifications_off = { - [48] = { X = 108, Y = 836, Sheet = 3926309567 }, - [36] = { X = 244, Y = 564, Sheet = 3926305904 }, - [72] = { X = 764, Y = 4, Sheet = 3926319099 }, - [96] = { X = 404, Y = 704, Sheet = 3926330123 }, - }, - movie = { - [72] = { X = 308, Y = 232, Sheet = 3926317787 }, - [36] = { X = 484, Y = 924, Sheet = 3926305904 }, - [96] = { X = 804, Y = 304, Sheet = 3926334787 }, - [48] = { X = 524, Y = 524, Sheet = 3926309567 }, - }, - my_location = { - [48] = { X = 472, Y = 680, Sheet = 3926309567 }, - [36] = { X = 404, Y = 764, Sheet = 3926305904 }, - [72] = { X = 916, Y = 460, Sheet = 3926319099 }, - [96] = { X = 904, Y = 4, Sheet = 3926334787 }, - }, - loupe = { - [72] = { X = 916, Y = 308, Sheet = 3926317787 }, - [36] = { X = 604, Y = 644, Sheet = 3926305904 }, - [96] = { X = 304, Y = 204, Sheet = 3926334787 }, - [48] = { X = 212, Y = 368, Sheet = 3926309567 }, - }, - forward_10 = { - [72] = { X = 460, Y = 308, Sheet = 3926316119 }, - [36] = { X = 164, Y = 204, Sheet = 3926305904 }, - [96] = { X = 504, Y = 304, Sheet = 3926326846 }, - [48] = { X = 472, Y = 940, Sheet = 3926307971 }, - }, - signal_cellular_connected_no_internet_4_bar = { - [72] = { X = 4, Y = 916, Sheet = 3926313458 }, - [36] = { X = 284, Y = 444, Sheet = 3926307971 }, - [96] = { X = 304, Y = 804, Sheet = 3926321212 }, - [48] = { X = 4, Y = 940, Sheet = 3926307971 }, - }, -} diff --git a/src/IconLabel/Spritesheet/Sheet12.lua b/src/IconLabel/Spritesheet/Sheet12.lua deleted file mode 100644 index c56e8beb..00000000 --- a/src/IconLabel/Spritesheet/Sheet12.lua +++ /dev/null @@ -1,195 +0,0 @@ -return { - border_left = { - [72] = { X = 916, Y = 916, Sheet = 3926314806 }, - [36] = { X = 124, Y = 244, Sheet = 3926307971 }, - [96] = { X = 204, Y = 504, Sheet = 3926329330 }, - [48] = { X = 732, Y = 160, Sheet = 3926311105 }, - }, - trending_up = { - [72] = { X = 80, Y = 840, Sheet = 3926316119 }, - [36] = { X = 524, Y = 84, Sheet = 3926305904 }, - [96] = { X = 204, Y = 104, Sheet = 3926319860 }, - [48] = { X = 940, Y = 940, Sheet = 3926311105 }, - }, - content_copy = { - [48] = { X = 108, Y = 56, Sheet = 3926311105 }, - [36] = { X = 924, Y = 764, Sheet = 3926305904 }, - [72] = { X = 232, Y = 460, Sheet = 3926319099 }, - [96] = { X = 204, Y = 804, Sheet = 3926326846 }, - }, - looks_4 = { - [48] = { X = 524, Y = 368, Sheet = 3926309567 }, - [36] = { X = 124, Y = 644, Sheet = 3926305904 }, - [72] = { X = 764, Y = 612, Sheet = 3926319099 }, - [96] = { X = 304, Y = 4, Sheet = 3926335698 }, - }, - group = { - [72] = { X = 384, Y = 764, Sheet = 3926317787 }, - [36] = { X = 4, Y = 844, Sheet = 3926305904 }, - [96] = { X = 404, Y = 604, Sheet = 3926334787 }, - [48] = { X = 756, Y = 524, Sheet = 3926307971 }, - }, - local_dining = { - [36] = { X = 164, Y = 564, Sheet = 3926305904 }, - [24] = { X = 88, Y = 4, Size = 24, Sheet = 3926305904 }, - [96] = { X = 104, Y = 504, Sheet = 3926335698 }, - [72] = { X = 460, Y = 840, Sheet = 3926316119 }, - [48] = { X = 264, Y = 212, Sheet = 3926309567 }, - }, - insert_invitation = { - [72] = { X = 612, Y = 688, Sheet = 3926316119 }, - [36] = { X = 124, Y = 404, Sheet = 3926305904 }, - [96] = { X = 504, Y = 4, Sheet = 3926333840 }, - [48] = { X = 4, Y = 836, Sheet = 3926307971 }, - }, - restaurant = { - [72] = { X = 384, Y = 4, Sheet = 3926313458 }, - [36] = { X = 804, Y = 444, Sheet = 3926307971 }, - [96] = { X = 4, Y = 904, Sheet = 3926333840 }, - [48] = { X = 732, Y = 4, Sheet = 3926309567 }, - }, - image_aspect_ratio = { - [72] = { X = 688, Y = 840, Sheet = 3926317787 }, - [36] = { X = 644, Y = 124, Sheet = 3926305904 }, - [96] = { X = 204, Y = 904, Sheet = 3926334787 }, - [48] = { X = 108, Y = 628, Sheet = 3926309567 }, - }, - do_not_disturb_on = { - [72] = { X = 384, Y = 840, Sheet = 3926316119 }, - [36] = { X = 884, Y = 524, Sheet = 3926305904 }, - [96] = { X = 704, Y = 304, Sheet = 3926321212 }, - [48] = { X = 472, Y = 316, Sheet = 3926309567 }, - }, - settings = { - [72] = { X = 156, Y = 236, Sheet = 3926312257 }, - [36] = { X = 324, Y = 124, Sheet = 3926307971 }, - [96] = { X = 604, Y = 404, Sheet = 3926330123 }, - [48] = { X = 472, Y = 784, Sheet = 3926307971 }, - }, - filter_4 = { - [72] = { X = 4, Y = 916, Sheet = 3926317787 }, - [36] = { X = 324, Y = 164, Sheet = 3926305904 }, - [96] = { X = 304, Y = 204, Sheet = 3926327588 }, - [48] = { X = 368, Y = 420, Sheet = 3926311105 }, - }, - low_priority = { - [72] = { X = 80, Y = 460, Sheet = 3926317787 }, - [36] = { X = 204, Y = 684, Sheet = 3926305904 }, - [96] = { X = 204, Y = 204, Sheet = 3926334787 }, - [48] = { X = 732, Y = 368, Sheet = 3926309567 }, - }, - cloud_download = { - [72] = { X = 612, Y = 4, Sheet = 3926317787 }, - [36] = { X = 204, Y = 844, Sheet = 3926305904 }, - [96] = { X = 304, Y = 404, Sheet = 3926328650 }, - [48] = { X = 680, Y = 56, Sheet = 3926312257 }, - }, - subtitles = { - [72] = { X = 612, Y = 916, Sheet = 3926316119 }, - [36] = { X = 924, Y = 524, Sheet = 3926305904 }, - [96] = { X = 604, Y = 304, Sheet = 3926319860 }, - [48] = { X = 524, Y = 420, Sheet = 3926309567 }, - }, - flare = { - [72] = { X = 308, Y = 764, Sheet = 3926317787 }, - [36] = { X = 364, Y = 164, Sheet = 3926305904 }, - [96] = { X = 904, Y = 504, Sheet = 3926327588 }, - [48] = { X = 4, Y = 316, Sheet = 3926311105 }, - }, - record_voice_over = { - [72] = { X = 840, Y = 688, Sheet = 3926313458 }, - [36] = { X = 524, Y = 444, Sheet = 3926307971 }, - [96] = { X = 404, Y = 604, Sheet = 3926333840 }, - [48] = { X = 316, Y = 212, Sheet = 3926309567 }, - }, - help_outline = { - [72] = { X = 916, Y = 688, Sheet = 3926317787 }, - [36] = { X = 684, Y = 804, Sheet = 3926305904 }, - [96] = { X = 904, Y = 804, Sheet = 3926334787 }, - [48] = { X = 784, Y = 888, Sheet = 3926307971 }, - }, - notifications_paused = { - [48] = { X = 472, Y = 836, Sheet = 3926309567 }, - [36] = { X = 284, Y = 564, Sheet = 3926305904 }, - [72] = { X = 308, Y = 80, Sheet = 3926319099 }, - [96] = { X = 704, Y = 504, Sheet = 3926330123 }, - }, - inbox = { - [72] = { X = 612, Y = 4, Sheet = 3926316119 }, - [36] = { X = 404, Y = 484, Sheet = 3926305904 }, - [96] = { X = 504, Y = 304, Sheet = 3926333840 }, - [48] = { X = 836, Y = 680, Sheet = 3926307971 }, - }, - looks_6 = { - [72] = { X = 916, Y = 4, Sheet = 3926317787 }, - [36] = { X = 964, Y = 604, Sheet = 3926305904 }, - [96] = { X = 404, Y = 4, Sheet = 3926335698 }, - [48] = { X = 264, Y = 420, Sheet = 3926309567 }, - }, - battery_50 = { - [72] = { X = 156, Y = 916, Sheet = 3926313458 }, - [36] = { X = 844, Y = 404, Sheet = 3926307971 }, - [96] = { X = 304, Y = 704, Sheet = 3926328650 }, - [48] = { X = 680, Y = 836, Sheet = 3926311105 }, - }, - crop = { - [72] = { X = 460, Y = 80, Sheet = 3926317787 }, - [36] = { X = 804, Y = 644, Sheet = 3926305904 }, - [96] = { X = 504, Y = 4, Sheet = 3926326846 }, - [48] = { X = 108, Y = 212, Sheet = 3926311105 }, - }, - find_in_page = { - [72] = { X = 612, Y = 764, Sheet = 3926317787 }, - [36] = { X = 124, Y = 844, Sheet = 3926305904 }, - [96] = { X = 504, Y = 104, Sheet = 3926327588 }, - [48] = { X = 680, Y = 108, Sheet = 3926312257 }, - }, - expand_more = { - [72] = { X = 4, Y = 308, Sheet = 3926314806 }, - [36] = { X = 564, Y = 284, Sheet = 3926305904 }, - [96] = { X = 4, Y = 704, Sheet = 3926326846 }, - [48] = { X = 784, Y = 472, Sheet = 3926311105 }, - }, - do_not_disturb_off = { - [72] = { X = 688, Y = 916, Sheet = 3926316119 }, - [36] = { X = 4, Y = 564, Sheet = 3926305904 }, - [96] = { X = 404, Y = 404, Sheet = 3926321212 }, - [48] = { X = 888, Y = 264, Sheet = 3926309567 }, - }, - cloud_upload = { - [48] = { X = 888, Y = 888, Sheet = 3926311105 }, - [36] = { X = 444, Y = 764, Sheet = 3926305904 }, - [72] = { X = 80, Y = 764, Sheet = 3926319099 }, - [96] = { X = 404, Y = 304, Sheet = 3926328650 }, - }, - stop = { - [48] = { X = 316, Y = 888, Sheet = 3926309567 }, - [36] = { X = 124, Y = 724, Sheet = 3926305904 }, - [72] = { X = 460, Y = 384, Sheet = 3926319099 }, - [96] = { X = 404, Y = 4, Sheet = 3926321212 }, - }, - cloud_done = { - [72] = { X = 688, Y = 80, Sheet = 3926317787 }, - [36] = { X = 284, Y = 764, Sheet = 3926305904 }, - [96] = { X = 604, Y = 304, Sheet = 3926328650 }, - [48] = { X = 4, Y = 784, Sheet = 3926311105 }, - }, - check_circle = { - [48] = { X = 472, Y = 836, Sheet = 3926311105 }, - [36] = { X = 284, Y = 924, Sheet = 3926305904 }, - [72] = { X = 156, Y = 764, Sheet = 3926319099 }, - [96] = { X = 404, Y = 604, Sheet = 3926329330 }, - }, - error = { - [72] = { X = 916, Y = 688, Sheet = 3926316119 }, - [36] = { X = 964, Y = 84, Sheet = 3926305904 }, - [96] = { X = 404, Y = 504, Sheet = 3926326846 }, - [48] = { X = 680, Y = 940, Sheet = 3926311105 }, - }, - signal_wifi_4_bar_lock = { - [72] = { X = 4, Y = 156, Sheet = 3926313458 }, - [36] = { X = 244, Y = 324, Sheet = 3926305904 }, - [96] = { X = 204, Y = 304, Sheet = 3926319860 }, - [48] = { X = 940, Y = 212, Sheet = 3926309567 }, - }, -} diff --git a/src/IconLabel/Spritesheet/Sheet2.lua b/src/IconLabel/Spritesheet/Sheet2.lua deleted file mode 100644 index c9c6880e..00000000 --- a/src/IconLabel/Spritesheet/Sheet2.lua +++ /dev/null @@ -1,502 +0,0 @@ -return { - assignment_late = { - [72] = { X = 4, Y = 80, Sheet = 3926313458 }, - [36] = { X = 404, Y = 524, Sheet = 3926307971 }, - [96] = { X = 204, Y = 404, Sheet = 3926327588 }, - [48] = { X = 576, Y = 576, Sheet = 3926311105 }, - }, - trending_flat = { - [72] = { X = 688, Y = 536, Sheet = 3926316119 }, - [36] = { X = 84, Y = 84, Sheet = 3926305904 }, - [96] = { X = 304, Y = 104, Sheet = 3926319860 }, - [48] = { X = 888, Y = 836, Sheet = 3926311105 }, - }, - present_to_all = { - [72] = { X = 156, Y = 308, Sheet = 3926313458 }, - [36] = { X = 924, Y = 324, Sheet = 3926307971 }, - [96] = { X = 204, Y = 504, Sheet = 3926333840 }, - [48] = { X = 368, Y = 264, Sheet = 3926309567 }, - }, - filter_frames = { - [72] = { X = 80, Y = 536, Sheet = 3926317787 }, - [36] = { X = 964, Y = 124, Sheet = 3926305904 }, - [96] = { X = 204, Y = 204, Sheet = 3926327588 }, - [48] = { X = 160, Y = 472, Sheet = 3926311105 }, - }, - view_compact = { - [48] = { X = 680, Y = 784, Sheet = 3926311105 }, - [36] = { X = 964, Y = 884, Sheet = 3926305904 }, - [72] = { X = 536, Y = 4, Sheet = 3926319099 }, - [96] = { X = 104, Y = 704, Sheet = 3926319860 }, - }, - style = { - [48] = { X = 784, Y = 368, Sheet = 3926309567 }, - [36] = { X = 284, Y = 604, Sheet = 3926305904 }, - [72] = { X = 232, Y = 232, Sheet = 3926319099 }, - [96] = { X = 804, Y = 104, Sheet = 3926319860 }, - }, - power_settings_new = { - [72] = { X = 156, Y = 840, Sheet = 3926314806 }, - [36] = { X = 44, Y = 364, Sheet = 3926305904 }, - [96] = { X = 604, Y = 104, Sheet = 3926330123 }, - [48] = { X = 628, Y = 56, Sheet = 3926309567 }, - }, - crop_5_4 = { - [72] = { X = 460, Y = 156, Sheet = 3926317787 }, - [36] = { X = 324, Y = 684, Sheet = 3926305904 }, - [96] = { X = 904, Y = 904, Sheet = 3926326846 }, - [48] = { X = 212, Y = 56, Sheet = 3926311105 }, - }, - panorama_vertical = { - [72] = { X = 612, Y = 312, Sheet = 3926312257 }, - [36] = { X = 4, Y = 884, Sheet = 3926305904 }, - [96] = { X = 504, Y = 804, Sheet = 3926330123 }, - [48] = { X = 628, Y = 836, Sheet = 3926309567 }, - }, - alarm_on = { - [72] = { X = 764, Y = 764, Sheet = 3926314806 }, - [36] = { X = 404, Y = 444, Sheet = 3926307971 }, - [96] = { X = 504, Y = 704, Sheet = 3926328650 }, - [48] = { X = 264, Y = 368, Sheet = 3926311105 }, - }, - filter_1 = { - [72] = { X = 764, Y = 536, Sheet = 3926317787 }, - [36] = { X = 364, Y = 484, Sheet = 3926305904 }, - [96] = { X = 204, Y = 904, Sheet = 3926327588 }, - [48] = { X = 472, Y = 56, Sheet = 3926312257 }, - }, - check_box = { [48] = { X = 4, Y = 836, Sheet = 3926311105 } }, - radio_button_unchecked = { [48] = { X = 628, Y = 420, Sheet = 3926309567 } }, - radio_button_checked = { [48] = { X = 784, Y = 420, Sheet = 3926309567 } }, - indeterminate_check_box = { [48] = { X = 4, Y = 732, Sheet = 3926307971 } }, - event_available = { - [72] = { X = 764, Y = 764, Sheet = 3926316119 }, - [36] = { X = 204, Y = 84, Sheet = 3926305904 }, - [96] = { X = 904, Y = 604, Sheet = 3926326846 }, - [48] = { X = 628, Y = 940, Sheet = 3926311105 }, - }, - filter_9_plus = { - [72] = { X = 156, Y = 688, Sheet = 3926317787 }, - [36] = { X = 644, Y = 164, Sheet = 3926305904 }, - [96] = { X = 104, Y = 104, Sheet = 3926327588 }, - [48] = { X = 368, Y = 472, Sheet = 3926311105 }, - }, - zoom_out = { - [72] = { X = 916, Y = 616, Sheet = 3926312257 }, - [36] = { X = 284, Y = 164, Sheet = 3926307971 }, - [96] = { X = 504, Y = 804, Sheet = 3926334787 }, - [48] = { X = 108, Y = 160, Sheet = 3926312257 }, - }, - vertical_align_bottom = { - [48] = { X = 836, Y = 160, Sheet = 3926311105 }, - [36] = { X = 124, Y = 524, Sheet = 3926305904 }, - [72] = { X = 80, Y = 232, Sheet = 3926319099 }, - [96] = { X = 104, Y = 404, Sheet = 3926319860 }, - }, - print = { - [72] = { X = 536, Y = 460, Sheet = 3926313458 }, - [36] = { X = 84, Y = 404, Sheet = 3926307971 }, - [96] = { X = 4, Y = 504, Sheet = 3926333840 }, - [48] = { X = 56, Y = 368, Sheet = 3926309567 }, - }, - replay = { - [72] = { X = 156, Y = 384, Sheet = 3926313458 }, - [36] = { X = 244, Y = 524, Sheet = 3926307971 }, - [96] = { X = 404, Y = 804, Sheet = 3926333840 }, - [48] = { X = 576, Y = 4, Sheet = 3926309567 }, - }, - replay_5 = { - [72] = { X = 308, Y = 4, Sheet = 3926313458 }, - [36] = { X = 924, Y = 284, Sheet = 3926307971 }, - [96] = { X = 204, Y = 804, Sheet = 3926333840 }, - [48] = { X = 888, Y = 56, Sheet = 3926309567 }, - }, - sentiment_neutral = { - [72] = { X = 764, Y = 536, Sheet = 3926314806 }, - [36] = { X = 524, Y = 364, Sheet = 3926307971 }, - [96] = { X = 4, Y = 204, Sheet = 3926330123 }, - [48] = { X = 160, Y = 576, Sheet = 3926307971 }, - }, - lock_outline = { - [48] = { X = 368, Y = 56, Sheet = 3926309567 }, - [36] = { X = 524, Y = 644, Sheet = 3926305904 }, - [72] = { X = 536, Y = 308, Sheet = 3926319099 }, - [96] = { X = 4, Y = 604, Sheet = 3926335698 }, - }, - reply_all = { - [72] = { X = 308, Y = 384, Sheet = 3926313458 }, - [36] = { X = 204, Y = 524, Sheet = 3926307971 }, - [96] = { X = 604, Y = 804, Sheet = 3926333840 }, - [48] = { X = 888, Y = 160, Sheet = 3926309567 }, - }, - swap_horiz = { - [72] = { X = 536, Y = 156, Sheet = 3926316119 }, - [36] = { X = 804, Y = 364, Sheet = 3926305904 }, - [96] = { X = 704, Y = 104, Sheet = 3926319860 }, - [48] = { X = 56, Y = 212, Sheet = 3926309567 }, - }, - repeat_one = { - [72] = { X = 80, Y = 460, Sheet = 3926313458 }, - [36] = { X = 364, Y = 484, Sheet = 3926307971 }, - [96] = { X = 704, Y = 704, Sheet = 3926333840 }, - [48] = { X = 212, Y = 4, Sheet = 3926309567 }, - }, - next_week = { - [48] = { X = 264, Y = 784, Sheet = 3926309567 }, - [36] = { X = 244, Y = 964, Sheet = 3926305904 }, - [72] = { X = 840, Y = 308, Sheet = 3926319099 }, - [96] = { X = 4, Y = 604, Sheet = 3926330123 }, - }, - ring_volume = { - [72] = { X = 612, Y = 232, Sheet = 3926313458 }, - [36] = { X = 84, Y = 524, Sheet = 3926307971 }, - [96] = { X = 604, Y = 704, Sheet = 3926333840 }, - [48] = { X = 368, Y = 784, Sheet = 3926307971 }, - }, - battery_alert = { - [72] = { X = 308, Y = 156, Sheet = 3926313458 }, - [36] = { X = 204, Y = 404, Sheet = 3926307971 }, - [96] = { X = 304, Y = 604, Sheet = 3926328650 }, - [48] = { X = 732, Y = 836, Sheet = 3926311105 }, - }, - report = { - [72] = { X = 156, Y = 232, Sheet = 3926313458 }, - [36] = { X = 964, Y = 444, Sheet = 3926307971 }, - [96] = { X = 704, Y = 804, Sheet = 3926333840 }, - [48] = { X = 4, Y = 56, Sheet = 3926309567 }, - }, - tonality = { - [72] = { X = 536, Y = 764, Sheet = 3926317787 }, - [36] = { X = 564, Y = 164, Sheet = 3926305904 }, - [96] = { X = 4, Y = 804, Sheet = 3926321212 }, - [48] = { X = 524, Y = 108, Sheet = 3926312257 }, - }, - cloud = { - [48] = { X = 264, Y = 940, Sheet = 3926311105 }, - [36] = { X = 324, Y = 764, Sheet = 3926305904 }, - [72] = { X = 156, Y = 460, Sheet = 3926319099 }, - [96] = { X = 504, Y = 304, Sheet = 3926328650 }, - }, - account_circle = { - [72] = { X = 80, Y = 312, Sheet = 3926312257 }, - [36] = { X = 124, Y = 204, Sheet = 3926307971 }, - [96] = { X = 804, Y = 804, Sheet = 3926328650 }, - [48] = { X = 472, Y = 264, Sheet = 3926311105 }, - }, - rotate_left = { - [72] = { X = 460, Y = 916, Sheet = 3926313458 }, - [36] = { X = 324, Y = 324, Sheet = 3926307971 }, - [96] = { X = 604, Y = 904, Sheet = 3926333840 }, - [48] = { X = 784, Y = 940, Sheet = 3926307971 }, - }, - battery_20 = { - [72] = { X = 80, Y = 764, Sheet = 3926313458 }, - [36] = { X = 204, Y = 84, Sheet = 3926307971 }, - [96] = { X = 904, Y = 604, Sheet = 3926328650 }, - [48] = { X = 888, Y = 940, Sheet = 3926311105 }, - }, - rounded_corner = { - [72] = { X = 536, Y = 840, Sheet = 3926313458 }, - [36] = { X = 764, Y = 444, Sheet = 3926307971 }, - [96] = { X = 504, Y = 904, Sheet = 3926333840 }, - [48] = { X = 420, Y = 784, Sheet = 3926307971 }, - }, - rotate_right = { - [72] = { X = 156, Y = 764, Sheet = 3926313458 }, - [36] = { X = 244, Y = 484, Sheet = 3926307971 }, - [96] = { X = 704, Y = 904, Sheet = 3926333840 }, - [48] = { X = 56, Y = 784, Sheet = 3926307971 }, - }, - computer = { - [72] = { X = 764, Y = 232, Sheet = 3926317787 }, - [36] = { X = 924, Y = 924, Sheet = 3926305904 }, - [96] = { X = 4, Y = 804, Sheet = 3926326846 }, - [48] = { X = 368, Y = 732, Sheet = 3926311105 }, - }, - music_note = { - [48] = { X = 56, Y = 524, Sheet = 3926309567 }, - [36] = { X = 364, Y = 804, Sheet = 3926305904 }, - [72] = { X = 764, Y = 536, Sheet = 3926319099 }, - [96] = { X = 204, Y = 404, Sheet = 3926334787 }, - }, - camera_roll = { - [72] = { X = 688, Y = 236, Sheet = 3926312257 }, - [36] = { X = 964, Y = 844, Sheet = 3926305904 }, - [96] = { X = 204, Y = 404, Sheet = 3926328650 }, - [48] = { X = 56, Y = 160, Sheet = 3926311105 }, - }, - restaurant_menu = { - [72] = { X = 4, Y = 384, Sheet = 3926313458 }, - [36] = { X = 44, Y = 484, Sheet = 3926307971 }, - [96] = { X = 404, Y = 904, Sheet = 3926333840 }, - [48] = { X = 680, Y = 4, Sheet = 3926309567 }, - }, - transform = { - [72] = { X = 232, Y = 460, Sheet = 3926314806 }, - [36] = { X = 844, Y = 244, Sheet = 3926305904 }, - [96] = { X = 404, Y = 104, Sheet = 3926321212 }, - [48] = { X = 108, Y = 576, Sheet = 3926311105 }, - }, - description = { - [48] = { X = 368, Y = 108, Sheet = 3926311105 }, - [36] = { X = 204, Y = 524, Sheet = 3926305904 }, - [72] = { X = 80, Y = 384, Sheet = 3926319099 }, - [96] = { X = 404, Y = 104, Sheet = 3926326846 }, - }, - cake = { - [72] = { X = 916, Y = 460, Sheet = 3926313458 }, - [36] = { X = 764, Y = 4, Sheet = 3926307971 }, - [96] = { X = 504, Y = 804, Sheet = 3926329330 }, - [48] = { X = 316, Y = 784, Sheet = 3926311105 }, - }, - room = { - [72] = { X = 688, Y = 384, Sheet = 3926313458 }, - [36] = { X = 884, Y = 444, Sheet = 3926307971 }, - [96] = { X = 804, Y = 904, Sheet = 3926333840 }, - [48] = { X = 160, Y = 836, Sheet = 3926307971 }, - }, - room_service = { - [72] = { X = 308, Y = 232, Sheet = 3926313458 }, - [36] = { X = 764, Y = 484, Sheet = 3926307971 }, - [96] = { X = 304, Y = 904, Sheet = 3926333840 }, - [48] = { X = 316, Y = 940, Sheet = 3926307971 }, - }, - error_outline = { - [72] = { X = 460, Y = 764, Sheet = 3926316119 }, - [36] = { X = 364, Y = 124, Sheet = 3926305904 }, - [96] = { X = 904, Y = 504, Sheet = 3926326846 }, - [48] = { X = 56, Y = 888, Sheet = 3926311105 }, - }, - line_weight = { - [72] = { X = 764, Y = 80, Sheet = 3926316119 }, - [36] = { X = 484, Y = 404, Sheet = 3926305904 }, - [96] = { X = 104, Y = 404, Sheet = 3926333840 }, - [48] = { X = 472, Y = 108, Sheet = 3926309567 }, - }, - settings_input_composite = { - [72] = { X = 80, Y = 688, Sheet = 3926313458 }, - [36] = { X = 404, Y = 4, Sheet = 3926307971 }, - [96] = { X = 504, Y = 304, Sheet = 3926330123 }, - [48] = { X = 160, Y = 680, Sheet = 3926307971 }, - }, - filter_9 = { - [72] = { X = 612, Y = 688, Sheet = 3926317787 }, - [36] = { X = 484, Y = 124, Sheet = 3926305904 }, - [96] = { X = 404, Y = 4, Sheet = 3926327588 }, - [48] = { X = 316, Y = 368, Sheet = 3926311105 }, - }, - unfold_more = { - [48] = { X = 56, Y = 732, Sheet = 3926311105 }, - [36] = { X = 764, Y = 684, Sheet = 3926305904 }, - [72] = { X = 80, Y = 4, Sheet = 3926319099 }, - [96] = { X = 304, Y = 304, Sheet = 3926319860 }, - }, - speaker_phone = { - [72] = { X = 840, Y = 616, Sheet = 3926312257 }, - [36] = { X = 364, Y = 964, Sheet = 3926305904 }, - [96] = { X = 204, Y = 804, Sheet = 3926319860 }, - [48] = { X = 628, Y = 888, Sheet = 3926309567 }, - }, - library_books = { - [72] = { X = 612, Y = 156, Sheet = 3926316119 }, - [36] = { X = 404, Y = 124, Sheet = 3926305904 }, - [96] = { X = 904, Y = 304, Sheet = 3926333840 }, - [48] = { X = 472, Y = 4, Sheet = 3926309567 }, - }, - directions_boat = { - [48] = { X = 888, Y = 576, Sheet = 3926311105 }, - [36] = { X = 84, Y = 524, Sheet = 3926305904 }, - [72] = { X = 840, Y = 80, Sheet = 3926319099 }, - [96] = { X = 4, Y = 304, Sheet = 3926321212 }, - }, - timer_3 = { - [72] = { X = 764, Y = 384, Sheet = 3926316119 }, - [36] = { X = 284, Y = 244, Sheet = 3926305904 }, - [96] = { X = 904, Y = 864, Sheet = 3926319099 }, - [48] = { X = 576, Y = 420, Sheet = 3926311105 }, - }, - remove = { - [72] = { X = 536, Y = 232, Sheet = 3926313458 }, - [36] = { X = 884, Y = 284, Sheet = 3926307971 }, - [96] = { X = 104, Y = 904, Sheet = 3926333840 }, - [48] = { X = 420, Y = 160, Sheet = 3926309567 }, - }, - restore = { - [72] = { X = 156, Y = 4, Sheet = 3926313458 }, - [36] = { X = 124, Y = 524, Sheet = 3926307971 }, - [96] = { X = 204, Y = 904, Sheet = 3926333840 }, - [48] = { X = 888, Y = 784, Sheet = 3926307971 }, - }, - party_mode = { - [72] = { X = 384, Y = 540, Sheet = 3926312257 }, - [36] = { X = 444, Y = 884, Sheet = 3926305904 }, - [96] = { X = 504, Y = 704, Sheet = 3926330123 }, - [48] = { X = 940, Y = 940, Sheet = 3926309567 }, - }, - more = { - [48] = { X = 576, Y = 680, Sheet = 3926309567 }, - [36] = { X = 4, Y = 964, Sheet = 3926305904 }, - [72] = { X = 764, Y = 460, Sheet = 3926319099 }, - [96] = { X = 404, Y = 404, Sheet = 3926334787 }, - }, - check_box_outline_blank = { [48] = { X = 940, Y = 784, Sheet = 3926311105 } }, - looks = { - [72] = { X = 156, Y = 460, Sheet = 3926317787 }, - [36] = { X = 684, Y = 644, Sheet = 3926305904 }, - [96] = { X = 904, Y = 204, Sheet = 3926334787 }, - [48] = { X = 108, Y = 420, Sheet = 3926309567 }, - }, - queue = { - [72] = { X = 916, Y = 764, Sheet = 3926313458 }, - [36] = { X = 484, Y = 444, Sheet = 3926307971 }, - [96] = { X = 704, Y = 504, Sheet = 3926333840 }, - [48] = { X = 732, Y = 420, Sheet = 3926309567 }, - }, - event = { - [36] = { X = 124, Y = 84, Sheet = 3926305904 }, - [24] = { X = 228, Y = 4, Size = 24, Sheet = 3926305904 }, - [96] = { X = 304, Y = 704, Sheet = 3926326846 }, - [72] = { X = 916, Y = 384, Sheet = 3926314806 }, - [48] = { X = 212, Y = 732, Sheet = 3926311105 }, - }, - flash_on = { - [72] = { X = 384, Y = 384, Sheet = 3926316119 }, - [36] = { X = 844, Y = 804, Sheet = 3926305904 }, - [96] = { X = 304, Y = 404, Sheet = 3926326846 }, - [48] = { X = 472, Y = 316, Sheet = 3926311105 }, - }, - border_outer = { - [72] = { X = 840, Y = 916, Sheet = 3926314806 }, - [36] = { X = 324, Y = 244, Sheet = 3926307971 }, - [96] = { X = 504, Y = 504, Sheet = 3926329330 }, - [48] = { X = 732, Y = 4, Sheet = 3926311105 }, - }, - battery_charging_90 = { - [72] = { X = 688, Y = 764, Sheet = 3926313458 }, - [36] = { X = 84, Y = 364, Sheet = 3926307971 }, - [96] = { X = 4, Y = 304, Sheet = 3926327588 }, - [48] = { X = 836, Y = 628, Sheet = 3926311105 }, - }, - radio = { - [72] = { X = 764, Y = 916, Sheet = 3926313458 }, - [36] = { X = 484, Y = 404, Sheet = 3926307971 }, - [96] = { X = 304, Y = 504, Sheet = 3926333840 }, - [48] = { X = 368, Y = 420, Sheet = 3926309567 }, - }, - cloud_queue = { - [48] = { X = 368, Y = 940, Sheet = 3926311105 }, - [36] = { X = 324, Y = 844, Sheet = 3926305904 }, - [72] = { X = 916, Y = 536, Sheet = 3926319099 }, - [96] = { X = 4, Y = 304, Sheet = 3926328650 }, - }, - add_to_photos = { - [72] = { X = 232, Y = 312, Sheet = 3926312257 }, - [36] = { X = 564, Y = 124, Sheet = 3926307971 }, - [96] = { X = 404, Y = 704, Sheet = 3926328650 }, - [48] = { X = 940, Y = 212, Sheet = 3926311105 }, - }, - visibility = { - [72] = { X = 232, Y = 844, Sheet = 3926312257 }, - [36] = { X = 84, Y = 44, Sheet = 3926307971 }, - [96] = { X = 604, Y = 4, Sheet = 3926321212 }, - [48] = { X = 576, Y = 56, Sheet = 3926311105 }, - }, - local_library = { - [48] = { X = 264, Y = 472, Sheet = 3926309567 }, - [36] = { X = 4, Y = 724, Sheet = 3926305904 }, - [72] = { X = 840, Y = 4, Sheet = 3926319099 }, - [96] = { X = 204, Y = 504, Sheet = 3926335698 }, - }, - looks_one = { - [72] = { X = 4, Y = 80, Sheet = 3926317787 }, - [36] = { X = 44, Y = 684, Sheet = 3926305904 }, - [96] = { X = 204, Y = 104, Sheet = 3926335698 }, - [48] = { X = 160, Y = 368, Sheet = 3926309567 }, - }, - developer_mode = { - [48] = { X = 888, Y = 680, Sheet = 3926311105 }, - [36] = { X = 204, Y = 604, Sheet = 3926305904 }, - [72] = { X = 612, Y = 688, Sheet = 3926319099 }, - [96] = { X = 104, Y = 204, Sheet = 3926326846 }, - }, - priority_high = { - [72] = { X = 764, Y = 764, Sheet = 3926313458 }, - [36] = { X = 164, Y = 364, Sheet = 3926307971 }, - [96] = { X = 404, Y = 504, Sheet = 3926333840 }, - [48] = { X = 420, Y = 264, Sheet = 3926309567 }, - }, - stay_current_portrait = { - [72] = { X = 840, Y = 4, Sheet = 3926317787 }, - [36] = { X = 84, Y = 964, Sheet = 3926305904 }, - [96] = { X = 604, Y = 904, Sheet = 3926321212 }, - [48] = { X = 108, Y = 680, Sheet = 3926309567 }, - }, - colorize = { - [72] = { X = 4, Y = 4, Sheet = 3926317787 }, - [36] = { X = 804, Y = 924, Sheet = 3926305904 }, - [96] = { X = 704, Y = 704, Sheet = 3926326846 }, - [48] = { X = 420, Y = 784, Sheet = 3926311105 }, - }, - near_me = { - [72] = { X = 612, Y = 384, Sheet = 3926317787 }, - [36] = { X = 604, Y = 764, Sheet = 3926305904 }, - [96] = { X = 4, Y = 404, Sheet = 3926334787 }, - [48] = { X = 368, Y = 732, Sheet = 3926309567 }, - }, - refresh = { - [72] = { X = 764, Y = 384, Sheet = 3926313458 }, - [36] = { X = 404, Y = 84, Sheet = 3926307971 }, - [96] = { X = 104, Y = 704, Sheet = 3926333840 }, - [48] = { X = 368, Y = 212, Sheet = 3926309567 }, - }, - format_list_numbered = { - [72] = { X = 384, Y = 232, Sheet = 3926316119 }, - [36] = { X = 44, Y = 204, Sheet = 3926305904 }, - [96] = { X = 204, Y = 504, Sheet = 3926327588 }, - [48] = { X = 576, Y = 4, Sheet = 3926312257 }, - }, - star_half = { - [36] = { X = 84, Y = 924, Sheet = 3926305904 }, - [24] = { X = 60, Y = 4, Size = 24, Sheet = 3926305904 }, - [96] = { X = 4, Y = 704, Sheet = 3926319860 }, - [72] = { X = 840, Y = 156, Sheet = 3926319099 }, - [48] = { X = 524, Y = 732, Sheet = 3926309567 }, - }, - folder = { - [72] = { X = 156, Y = 80, Sheet = 3926316119 }, - [36] = { X = 804, Y = 44, Sheet = 3926305904 }, - [96] = { X = 604, Y = 204, Sheet = 3926326846 }, - [48] = { X = 108, Y = 472, Sheet = 3926311105 }, - }, - settings_voice = { - [72] = { X = 156, Y = 540, Sheet = 3926312257 }, - [36] = { X = 324, Y = 4, Sheet = 3926307971 }, - [96] = { X = 404, Y = 404, Sheet = 3926330123 }, - [48] = { X = 264, Y = 836, Sheet = 3926307971 }, - }, - wb_cloudy = { - [72] = { X = 840, Y = 384, Sheet = 3926313458 }, - [36] = { X = 44, Y = 84, Sheet = 3926307971 }, - [96] = { X = 404, Y = 204, Sheet = 3926319860 }, - [48] = { X = 108, Y = 888, Sheet = 3926311105 }, - }, - cached = { - [72] = { X = 688, Y = 536, Sheet = 3926313458 }, - [36] = { X = 204, Y = 124, Sheet = 3926307971 }, - [96] = { X = 204, Y = 804, Sheet = 3926329330 }, - [48] = { X = 420, Y = 732, Sheet = 3926311105 }, - }, - redo = { - [72] = { X = 232, Y = 764, Sheet = 3926313458 }, - [36] = { X = 444, Y = 84, Sheet = 3926307971 }, - [96] = { X = 904, Y = 604, Sheet = 3926333840 }, - [48] = { X = 472, Y = 212, Sheet = 3926309567 }, - }, - star = { - [36] = { X = 44, Y = 804, Sheet = 3926305904 }, - [24] = { X = 116, Y = 4, Size = 24, Sheet = 3926305904 }, - [96] = { X = 704, Y = 504, Sheet = 3926319860 }, - [72] = { X = 384, Y = 156, Sheet = 3926317787 }, - [48] = { X = 472, Y = 732, Sheet = 3926309567 }, - }, -} diff --git a/src/IconLabel/Spritesheet/Sheet3.lua b/src/IconLabel/Spritesheet/Sheet3.lua deleted file mode 100644 index 6379b886..00000000 --- a/src/IconLabel/Spritesheet/Sheet3.lua +++ /dev/null @@ -1,501 +0,0 @@ -return { - featured_video = { - [72] = { X = 4, Y = 536, Sheet = 3926316119 }, - [36] = { X = 604, Y = 484, Sheet = 3926305904 }, - [96] = { X = 404, Y = 704, Sheet = 3926327588 }, - [48] = { X = 56, Y = 160, Sheet = 3926312257 }, - }, - phone_iphone = { - [72] = { X = 536, Y = 768, Sheet = 3926312257 }, - [36] = { X = 84, Y = 124, Sheet = 3926307971 }, - [96] = { X = 4, Y = 404, Sheet = 3926329330 }, - [48] = { X = 784, Y = 732, Sheet = 3926309567 }, - }, - ac_unit = { - [72] = { X = 156, Y = 768, Sheet = 3926312257 }, - [36] = { X = 604, Y = 124, Sheet = 3926307971 }, - [96] = { X = 804, Y = 904, Sheet = 3926328650 }, - [48] = { X = 732, Y = 108, Sheet = 3926312257 }, - }, - store_mall_directory = { - [72] = { X = 156, Y = 156, Sheet = 3926317787 }, - [36] = { X = 444, Y = 684, Sheet = 3926305904 }, - [96] = { X = 104, Y = 504, Sheet = 3926321212 }, - [48] = { X = 732, Y = 576, Sheet = 3926309567 }, - }, - insert_drive_file = { - [72] = { X = 308, Y = 308, Sheet = 3926314806 }, - [36] = { X = 124, Y = 484, Sheet = 3926305904 }, - [96] = { X = 304, Y = 4, Sheet = 3926333840 }, - [48] = { X = 368, Y = 836, Sheet = 3926307971 }, - }, - power = { - [72] = { X = 688, Y = 764, Sheet = 3926314806 }, - [36] = { X = 164, Y = 324, Sheet = 3926305904 }, - [96] = { X = 404, Y = 104, Sheet = 3926330123 }, - [48] = { X = 56, Y = 472, Sheet = 3926309567 }, - }, - color_lens = { - [48] = { X = 368, Y = 784, Sheet = 3926311105 }, - [36] = { X = 44, Y = 964, Sheet = 3926305904 }, - [72] = { X = 308, Y = 536, Sheet = 3926319099 }, - [96] = { X = 4, Y = 4, Sheet = 3926327588 }, - }, - redeem = { - [72] = { X = 384, Y = 840, Sheet = 3926313458 }, - [36] = { X = 124, Y = 84, Sheet = 3926307971 }, - [96] = { X = 504, Y = 604, Sheet = 3926333840 }, - [48] = { X = 160, Y = 212, Sheet = 3926309567 }, - }, - local_mall = { - [48] = { X = 420, Y = 472, Sheet = 3926309567 }, - [36] = { X = 644, Y = 524, Sheet = 3926305904 }, - [72] = { X = 916, Y = 4, Sheet = 3926319099 }, - [96] = { X = 104, Y = 4, Sheet = 3926334787 }, - }, - hotel = { - [36] = { X = 84, Y = 164, Sheet = 3926305904 }, - [24] = { X = 256, Y = 4, Size = 24, Sheet = 3926305904 }, - [96] = { X = 604, Y = 504, Sheet = 3926334787 }, - [72] = { X = 384, Y = 688, Sheet = 3926317787 }, - [48] = { X = 628, Y = 628, Sheet = 3926309567 }, - }, - settings_ethernet = { - [72] = { X = 156, Y = 692, Sheet = 3926312257 }, - [36] = { X = 484, Y = 164, Sheet = 3926307971 }, - [96] = { X = 404, Y = 304, Sheet = 3926330123 }, - [48] = { X = 4, Y = 888, Sheet = 3926307971 }, - }, - phone_forwarded = { - [72] = { X = 80, Y = 768, Sheet = 3926312257 }, - [36] = { X = 484, Y = 204, Sheet = 3926307971 }, - [96] = { X = 704, Y = 4, Sheet = 3926329330 }, - [48] = { X = 56, Y = 784, Sheet = 3926309567 }, - }, - menu = { - [72] = { X = 612, Y = 156, Sheet = 3926317787 }, - [36] = { X = 604, Y = 684, Sheet = 3926305904 }, - [96] = { X = 904, Y = 104, Sheet = 3926334787 }, - [48] = { X = 4, Y = 524, Sheet = 3926309567 }, - }, - filter = { - [72] = { X = 688, Y = 764, Sheet = 3926317787 }, - [36] = { X = 444, Y = 804, Sheet = 3926305904 }, - [96] = { X = 104, Y = 504, Sheet = 3926327588 }, - [48] = { X = 56, Y = 108, Sheet = 3926312257 }, - }, - hdr_off = { - [72] = { X = 536, Y = 840, Sheet = 3926317787 }, - [36] = { X = 444, Y = 164, Sheet = 3926305904 }, - [96] = { X = 204, Y = 604, Sheet = 3926334787 }, - [48] = { X = 420, Y = 576, Sheet = 3926307971 }, - }, - network_locked = { - [72] = { X = 536, Y = 384, Sheet = 3926317787 }, - [36] = { X = 244, Y = 764, Sheet = 3926305904 }, - [96] = { X = 604, Y = 4, Sheet = 3926334787 }, - [48] = { X = 836, Y = 732, Sheet = 3926309567 }, - }, - router = { - [72] = { X = 688, Y = 916, Sheet = 3926313458 }, - [36] = { X = 604, Y = 484, Sheet = 3926307971 }, - [96] = { X = 604, Y = 604, Sheet = 3926333840 }, - [48] = { X = 524, Y = 940, Sheet = 3926307971 }, - }, - drive_eta = { - [72] = { X = 840, Y = 688, Sheet = 3926316119 }, - [36] = { X = 204, Y = 404, Sheet = 3926305904 }, - [96] = { X = 504, Y = 504, Sheet = 3926326846 }, - [48] = { X = 732, Y = 888, Sheet = 3926311105 }, - }, - find_replace = { - [72] = { X = 4, Y = 764, Sheet = 3926317787 }, - [36] = { X = 724, Y = 844, Sheet = 3926305904 }, - [96] = { X = 404, Y = 104, Sheet = 3926327588 }, - [48] = { X = 836, Y = 56, Sheet = 3926312257 }, - }, - rotate_90_degrees_ccw = { - [72] = { X = 612, Y = 4, Sheet = 3926313458 }, - [36] = { X = 684, Y = 284, Sheet = 3926307971 }, - [96] = { X = 904, Y = 904, Sheet = 3926333840 }, - [48] = { X = 472, Y = 836, Sheet = 3926307971 }, - }, - recent_actors = { - [72] = { X = 4, Y = 764, Sheet = 3926313458 }, - [36] = { X = 764, Y = 404, Sheet = 3926307971 }, - [96] = { X = 704, Y = 604, Sheet = 3926333840 }, - [48] = { X = 836, Y = 108, Sheet = 3926309567 }, - }, - playlist_play = { - [72] = { X = 536, Y = 4, Sheet = 3926314806 }, - [36] = { X = 244, Y = 284, Sheet = 3926307971 }, - [96] = { X = 604, Y = 404, Sheet = 3926329330 }, - [48] = { X = 368, Y = 368, Sheet = 3926309567 }, - }, - today = { - [72] = { X = 840, Y = 916, Sheet = 3926317787 }, - [36] = { X = 484, Y = 164, Sheet = 3926305904 }, - [96] = { X = 204, Y = 604, Sheet = 3926319860 }, - [48] = { X = 264, Y = 264, Sheet = 3926311105 }, - }, - class = { - [72] = { X = 308, Y = 384, Sheet = 3926317787 }, - [36] = { X = 4, Y = 764, Sheet = 3926305904 }, - [96] = { X = 204, Y = 704, Sheet = 3926329330 }, - [48] = { X = 316, Y = 160, Sheet = 3926311105 }, - }, - settings_input_component = { - [72] = { X = 840, Y = 388, Sheet = 3926312257 }, - [36] = { X = 804, Y = 164, Sheet = 3926307971 }, - [96] = { X = 104, Y = 304, Sheet = 3926330123 }, - [48] = { X = 524, Y = 888, Sheet = 3926307971 }, - }, - settings_input_hdmi = { - [72] = { X = 4, Y = 612, Sheet = 3926313458 }, - [36] = { X = 4, Y = 84, Sheet = 3926307971 }, - [96] = { X = 204, Y = 304, Sheet = 3926330123 }, - [48] = { X = 420, Y = 680, Sheet = 3926307971 }, - }, - crop_portrait = { - [72] = { X = 916, Y = 384, Sheet = 3926317787 }, - [36] = { X = 924, Y = 644, Sheet = 3926305904 }, - [96] = { X = 104, Y = 104, Sheet = 3926326846 }, - [48] = { X = 472, Y = 212, Sheet = 3926311105 }, - }, - settings_cell = { - [72] = { X = 232, Y = 768, Sheet = 3926312257 }, - [36] = { X = 84, Y = 244, Sheet = 3926307971 }, - [96] = { X = 4, Y = 304, Sheet = 3926330123 }, - [48] = { X = 680, Y = 888, Sheet = 3926307971 }, - }, - access_alarm = { - [72] = { X = 384, Y = 692, Sheet = 3926312257 }, - [36] = { X = 284, Y = 244, Sheet = 3926307971 }, - [96] = { X = 304, Y = 904, Sheet = 3926328650 }, - [48] = { X = 264, Y = 4, Sheet = 3926312257 }, - }, - broken_image = { - [72] = { X = 384, Y = 616, Sheet = 3926312257 }, - [36] = { X = 44, Y = 44, Sheet = 3926307971 }, - [96] = { X = 304, Y = 804, Sheet = 3926329330 }, - [48] = { X = 784, Y = 56, Sheet = 3926311105 }, - }, - settings_bluetooth = { - [72] = { X = 4, Y = 844, Sheet = 3926312257 }, - [36] = { X = 524, Y = 124, Sheet = 3926307971 }, - [96] = { X = 904, Y = 204, Sheet = 3926330123 }, - [48] = { X = 444, Y = 524, Sheet = 3926307971 }, - }, - settings_backup_restore = { - [72] = { X = 4, Y = 312, Sheet = 3926312257 }, - [36] = { X = 4, Y = 204, Sheet = 3926307971 }, - [96] = { X = 504, Y = 204, Sheet = 3926330123 }, - [48] = { X = 212, Y = 628, Sheet = 3926307971 }, - }, - settings_applications = { - [72] = { X = 840, Y = 844, Sheet = 3926312257 }, - [36] = { X = 44, Y = 404, Sheet = 3926307971 }, - [96] = { X = 704, Y = 204, Sheet = 3926330123 }, - [48] = { X = 160, Y = 628, Sheet = 3926307971 }, - }, - settings_brightness = { - [72] = { X = 688, Y = 692, Sheet = 3926312257 }, - [36] = { X = 604, Y = 244, Sheet = 3926307971 }, - [96] = { X = 604, Y = 304, Sheet = 3926330123 }, - [48] = { X = 108, Y = 576, Sheet = 3926307971 }, - }, - insert_emoticon = { - [72] = { X = 80, Y = 308, Sheet = 3926314806 }, - [36] = { X = 164, Y = 484, Sheet = 3926305904 }, - [96] = { X = 204, Y = 4, Sheet = 3926333840 }, - [48] = { X = 784, Y = 836, Sheet = 3926307971 }, - }, - settings_input_svideo = { - [72] = { X = 4, Y = 536, Sheet = 3926313458 }, - [36] = { X = 724, Y = 44, Sheet = 3926307971 }, - [96] = { X = 804, Y = 204, Sheet = 3926330123 }, - [48] = { X = 316, Y = 628, Sheet = 3926309567 }, - }, - alarm_off = { - [72] = { X = 536, Y = 460, Sheet = 3926314806 }, - [36] = { X = 404, Y = 404, Sheet = 3926307971 }, - [96] = { X = 204, Y = 804, Sheet = 3926328650 }, - [48] = { X = 940, Y = 368, Sheet = 3926311105 }, - }, - reorder = { - [72] = { X = 4, Y = 308, Sheet = 3926313458 }, - [36] = { X = 564, Y = 484, Sheet = 3926307971 }, - [96] = { X = 904, Y = 704, Sheet = 3926333840 }, - [48] = { X = 316, Y = 4, Sheet = 3926309567 }, - }, - remove_circle_outline = { - [72] = { X = 764, Y = 308, Sheet = 3926313458 }, - [36] = { X = 844, Y = 324, Sheet = 3926307971 }, - [96] = { X = 4, Y = 704, Sheet = 3926333840 }, - [48] = { X = 420, Y = 108, Sheet = 3926309567 }, - }, - nfc = { - [48] = { X = 212, Y = 784, Sheet = 3926309567 }, - [36] = { X = 764, Y = 884, Sheet = 3926305904 }, - [72] = { X = 612, Y = 308, Sheet = 3926319099 }, - [96] = { X = 804, Y = 504, Sheet = 3926330123 }, - }, - open_in_browser = { - [72] = { X = 156, Y = 844, Sheet = 3926312257 }, - [36] = { X = 244, Y = 884, Sheet = 3926305904 }, - [96] = { X = 904, Y = 604, Sheet = 3926330123 }, - [48] = { X = 628, Y = 940, Sheet = 3926309567 }, - }, - sync_disabled = { - [72] = { X = 460, Y = 384, Sheet = 3926314806 }, - [36] = { X = 444, Y = 284, Sheet = 3926305904 }, - [96] = { X = 404, Y = 504, Sheet = 3926321212 }, - [48] = { X = 732, Y = 836, Sheet = 3926307971 }, - }, - share = { - [72] = { X = 156, Y = 612, Sheet = 3926313458 }, - [36] = { X = 884, Y = 84, Sheet = 3926307971 }, - [96] = { X = 504, Y = 404, Sheet = 3926330123 }, - [48] = { X = 628, Y = 836, Sheet = 3926307971 }, - }, - donut_large = { - [72] = { X = 536, Y = 536, Sheet = 3926316119 }, - [36] = { X = 644, Y = 404, Sheet = 3926305904 }, - [96] = { X = 604, Y = 404, Sheet = 3926321212 }, - [48] = { X = 940, Y = 264, Sheet = 3926309567 }, - }, - format_clear = { - [72] = { X = 764, Y = 612, Sheet = 3926317787 }, - [36] = { X = 284, Y = 204, Sheet = 3926305904 }, - [96] = { X = 204, Y = 404, Sheet = 3926326846 }, - [48] = { X = 940, Y = 420, Sheet = 3926311105 }, - }, - shopping_basket = { - [72] = { X = 460, Y = 692, Sheet = 3926312257 }, - [36] = { X = 924, Y = 204, Sheet = 3926307971 }, - [96] = { X = 704, Y = 404, Sheet = 3926330123 }, - [48] = { X = 56, Y = 940, Sheet = 3926307971 }, - }, - local_hotel = { - [48] = { X = 888, Y = 420, Sheet = 3926309567 }, - [36] = { X = 724, Y = 684, Sheet = 3926305904 }, - [72] = { X = 536, Y = 80, Sheet = 3926319099 }, - [96] = { X = 104, Y = 304, Sheet = 3926334787 }, - }, - battery_90 = { - [72] = { X = 384, Y = 156, Sheet = 3926313458 }, - [36] = { X = 444, Y = 444, Sheet = 3926307971 }, - [96] = { X = 304, Y = 504, Sheet = 3926328650 }, - [48] = { X = 472, Y = 888, Sheet = 3926311105 }, - }, - shop = { - [72] = { X = 916, Y = 540, Sheet = 3926312257 }, - [36] = { X = 684, Y = 44, Sheet = 3926307971 }, - [96] = { X = 804, Y = 404, Sheet = 3926330123 }, - [48] = { X = 680, Y = 836, Sheet = 3926307971 }, - }, - group_add = { - [72] = { X = 308, Y = 916, Sheet = 3926317787 }, - [36] = { X = 84, Y = 844, Sheet = 3926305904 }, - [96] = { X = 504, Y = 604, Sheet = 3926334787 }, - [48] = { X = 472, Y = 628, Sheet = 3926307971 }, - }, - settings_remote = { - [72] = { X = 232, Y = 388, Sheet = 3926312257 }, - [36] = { X = 324, Y = 44, Sheet = 3926307971 }, - [96] = { X = 904, Y = 304, Sheet = 3926330123 }, - [48] = { X = 628, Y = 628, Sheet = 3926307971 }, - }, - system_update = { - [72] = { X = 232, Y = 308, Sheet = 3926314806 }, - [36] = { X = 4, Y = 484, Sheet = 3926305904 }, - [96] = { X = 404, Y = 204, Sheet = 3926321212 }, - [48] = { X = 524, Y = 836, Sheet = 3926307971 }, - }, - settings_system_daydream = { - [72] = { X = 612, Y = 464, Sheet = 3926312257 }, - [36] = { X = 244, Y = 44, Sheet = 3926307971 }, - [96] = { X = 4, Y = 404, Sheet = 3926330123 }, - [48] = { X = 316, Y = 732, Sheet = 3926307971 }, - }, - sentiment_very_satisfied = { - [72] = { X = 764, Y = 844, Sheet = 3926312257 }, - [36] = { X = 404, Y = 364, Sheet = 3926307971 }, - [96] = { X = 104, Y = 404, Sheet = 3926330123 }, - [48] = { X = 808, Y = 524, Sheet = 3926307971 }, - }, - select_all = { - [72] = { X = 384, Y = 612, Sheet = 3926314806 }, - [36] = { X = 444, Y = 364, Sheet = 3926307971 }, - [96] = { X = 304, Y = 204, Sheet = 3926330123 }, - [48] = { X = 420, Y = 888, Sheet = 3926307971 }, - }, - exposure_plus_1 = { - [72] = { X = 916, Y = 4, Sheet = 3926314806 }, - [36] = { X = 604, Y = 364, Sheet = 3926305904 }, - [96] = { X = 904, Y = 804, Sheet = 3926327588 }, - [48] = { X = 368, Y = 576, Sheet = 3926311105 }, - }, - phonelink_ring = { - [72] = { X = 384, Y = 536, Sheet = 3926314806 }, - [36] = { X = 964, Y = 164, Sheet = 3926307971 }, - [96] = { X = 804, Y = 104, Sheet = 3926329330 }, - [48] = { X = 576, Y = 524, Sheet = 3926309567 }, - }, - screen_lock_portrait = { - [72] = { X = 80, Y = 4, Sheet = 3926314806 }, - [36] = { X = 124, Y = 364, Sheet = 3926307971 }, - [96] = { X = 804, Y = 4, Sheet = 3926330123 }, - [48] = { X = 420, Y = 628, Sheet = 3926309567 }, - }, - school = { - [72] = { X = 308, Y = 840, Sheet = 3926314806 }, - [36] = { X = 324, Y = 404, Sheet = 3926307971 }, - [96] = { X = 604, Y = 4, Sheet = 3926330123 }, - [48] = { X = 732, Y = 628, Sheet = 3926307971 }, - }, - scanner = { - [72] = { X = 232, Y = 840, Sheet = 3926314806 }, - [36] = { X = 964, Y = 404, Sheet = 3926307971 }, - [96] = { X = 704, Y = 4, Sheet = 3926330123 }, - [48] = { X = 56, Y = 732, Sheet = 3926307971 }, - }, - credit_card = { - [72] = { X = 536, Y = 156, Sheet = 3926317787 }, - [36] = { X = 244, Y = 644, Sheet = 3926305904 }, - [96] = { X = 704, Y = 904, Sheet = 3926326846 }, - [48] = { X = 836, Y = 368, Sheet = 3926311105 }, - }, - screen_lock_rotation = { - [72] = { X = 232, Y = 80, Sheet = 3926314806 }, - [36] = { X = 44, Y = 364, Sheet = 3926307971 }, - [96] = { X = 904, Y = 4, Sheet = 3926330123 }, - [48] = { X = 524, Y = 628, Sheet = 3926309567 }, - }, - format_indent_decrease = { - [72] = { X = 536, Y = 308, Sheet = 3926316119 }, - [36] = { X = 484, Y = 244, Sheet = 3926305904 }, - [96] = { X = 304, Y = 604, Sheet = 3926327588 }, - [48] = { X = 108, Y = 4, Sheet = 3926312257 }, - }, - rv_hookup = { - [72] = { X = 764, Y = 80, Sheet = 3926313458 }, - [36] = { X = 204, Y = 444, Sheet = 3926307971 }, - [96] = { X = 504, Y = 4, Sheet = 3926330123 }, - [48] = { X = 264, Y = 732, Sheet = 3926307971 }, - }, - schedule = { - [72] = { X = 156, Y = 156, Sheet = 3926314806 }, - [36] = { X = 924, Y = 404, Sheet = 3926307971 }, - [96] = { X = 4, Y = 104, Sheet = 3926330123 }, - [48] = { X = 160, Y = 732, Sheet = 3926307971 }, - }, - tag_faces = { - [72] = { X = 460, Y = 764, Sheet = 3926317787 }, - [36] = { X = 124, Y = 164, Sheet = 3926305904 }, - [96] = { X = 404, Y = 904, Sheet = 3926321212 }, - [48] = { X = 160, Y = 888, Sheet = 3926307971 }, - }, - laptop = { - [72] = { X = 840, Y = 764, Sheet = 3926316119 }, - [36] = { X = 604, Y = 84, Sheet = 3926305904 }, - [96] = { X = 4, Y = 304, Sheet = 3926333840 }, - [48] = { X = 784, Y = 160, Sheet = 3926309567 }, - }, - delete = { - [48] = { X = 4, Y = 212, Sheet = 3926311105 }, - [36] = { X = 644, Y = 724, Sheet = 3926305904 }, - [72] = { X = 156, Y = 384, Sheet = 3926319099 }, - [96] = { X = 604, Y = 104, Sheet = 3926326846 }, - }, - chevron_right = { - [48] = { X = 108, Y = 160, Sheet = 3926311105 }, - [36] = { X = 924, Y = 884, Sheet = 3926305904 }, - [72] = { X = 156, Y = 688, Sheet = 3926319099 }, - [96] = { X = 204, Y = 604, Sheet = 3926329330 }, - }, - filter_3 = { - [72] = { X = 308, Y = 536, Sheet = 3926317787 }, - [36] = { X = 884, Y = 444, Sheet = 3926305904 }, - [96] = { X = 404, Y = 804, Sheet = 3926327588 }, - [48] = { X = 524, Y = 420, Sheet = 3926311105 }, - }, - details = { - [48] = { X = 732, Y = 680, Sheet = 3926311105 }, - [36] = { X = 724, Y = 484, Sheet = 3926305904 }, - [72] = { X = 764, Y = 156, Sheet = 3926319099 }, - [96] = { X = 204, Y = 104, Sheet = 3926326846 }, - }, - rss_feed = { - [72] = { X = 612, Y = 156, Sheet = 3926313458 }, - [36] = { X = 284, Y = 84, Sheet = 3926307971 }, - [96] = { X = 4, Y = 4, Sheet = 3926330123 }, - [48] = { X = 836, Y = 940, Sheet = 3926307971 }, - }, - satellite = { - [72] = { X = 156, Y = 156, Sheet = 3926313458 }, - [36] = { X = 684, Y = 444, Sheet = 3926307971 }, - [96] = { X = 204, Y = 4, Sheet = 3926330123 }, - [48] = { X = 628, Y = 680, Sheet = 3926307971 }, - }, - save = { - [72] = { X = 612, Y = 612, Sheet = 3926314806 }, - [36] = { X = 684, Y = 404, Sheet = 3926307971 }, - [96] = { X = 304, Y = 4, Sheet = 3926330123 }, - [48] = { X = 576, Y = 680, Sheet = 3926307971 }, - }, - laptop_windows = { - [72] = { X = 612, Y = 764, Sheet = 3926316119 }, - [36] = { X = 324, Y = 84, Sheet = 3926305904 }, - [96] = { X = 704, Y = 204, Sheet = 3926333840 }, - [48] = { X = 836, Y = 4, Sheet = 3926309567 }, - }, - reply = { - [72] = { X = 840, Y = 4, Sheet = 3926313458 }, - [36] = { X = 684, Y = 484, Sheet = 3926307971 }, - [96] = { X = 504, Y = 804, Sheet = 3926333840 }, - [48] = { X = 680, Y = 160, Sheet = 3926309567 }, - }, - camera_rear = { - [72] = { X = 308, Y = 236, Sheet = 3926312257 }, - [36] = { X = 124, Y = 884, Sheet = 3926305904 }, - [96] = { X = 704, Y = 404, Sheet = 3926328650 }, - [48] = { X = 160, Y = 160, Sheet = 3926311105 }, - }, - streetview = { - [48] = { X = 316, Y = 368, Sheet = 3926309567 }, - [36] = { X = 844, Y = 604, Sheet = 3926305904 }, - [72] = { X = 840, Y = 232, Sheet = 3926319099 }, - [96] = { X = 604, Y = 4, Sheet = 3926319860 }, - }, - mail = { - [72] = { X = 308, Y = 156, Sheet = 3926317787 }, - [36] = { X = 804, Y = 724, Sheet = 3926305904 }, - [96] = { X = 304, Y = 104, Sheet = 3926334787 }, - [48] = { X = 628, Y = 576, Sheet = 3926309567 }, - }, - picture_in_picture_alt = { - [72] = { X = 536, Y = 612, Sheet = 3926314806 }, - [36] = { X = 844, Y = 364, Sheet = 3926307971 }, - [96] = { X = 404, Y = 304, Sheet = 3926329330 }, - [48] = { X = 576, Y = 888, Sheet = 3926309567 }, - }, - pause = { - [72] = { X = 4, Y = 464, Sheet = 3926312257 }, - [36] = { X = 804, Y = 124, Sheet = 3926307971 }, - [96] = { X = 904, Y = 404, Sheet = 3926330123 }, - [48] = { X = 524, Y = 212, Sheet = 3926309567 }, - }, - keyboard_arrow_up = { - [72] = { X = 916, Y = 308, Sheet = 3926314806 }, - [36] = { X = 164, Y = 284, Sheet = 3926305904 }, - [96] = { X = 604, Y = 104, Sheet = 3926333840 }, - [48] = { X = 576, Y = 940, Sheet = 3926307971 }, - }, - dialer_sip = { - [48] = { X = 264, Y = 628, Sheet = 3926311105 }, - [36] = { X = 684, Y = 604, Sheet = 3926305904 }, - [72] = { X = 688, Y = 764, Sheet = 3926319099 }, - [96] = { X = 204, Y = 904, Sheet = 3926326846 }, - }, -} diff --git a/src/IconLabel/Spritesheet/Sheet4.lua b/src/IconLabel/Spritesheet/Sheet4.lua deleted file mode 100644 index 6131443a..00000000 --- a/src/IconLabel/Spritesheet/Sheet4.lua +++ /dev/null @@ -1,502 +0,0 @@ -return { - sentiment_satisfied = { - [72] = { X = 764, Y = 840, Sheet = 3926314806 }, - [36] = { X = 644, Y = 324, Sheet = 3926307971 }, - [96] = { X = 104, Y = 204, Sheet = 3926330123 }, - [48] = { X = 368, Y = 576, Sheet = 3926307971 }, - }, - send = { - [72] = { X = 460, Y = 840, Sheet = 3926314806 }, - [36] = { X = 44, Y = 284, Sheet = 3926307971 }, - [96] = { X = 804, Y = 104, Sheet = 3926330123 }, - [48] = { X = 368, Y = 888, Sheet = 3926307971 }, - }, - security = { - [72] = { X = 232, Y = 612, Sheet = 3926314806 }, - [36] = { X = 164, Y = 284, Sheet = 3926307971 }, - [96] = { X = 204, Y = 204, Sheet = 3926330123 }, - [48] = { X = 940, Y = 836, Sheet = 3926307971 }, - }, - flag = { - [72] = { X = 536, Y = 916, Sheet = 3926317787 }, - [36] = { X = 404, Y = 164, Sheet = 3926305904 }, - [96] = { X = 804, Y = 504, Sheet = 3926327588 }, - [48] = { X = 628, Y = 316, Sheet = 3926311105 }, - }, - burst_mode = { - [72] = { X = 688, Y = 612, Sheet = 3926313458 }, - [36] = { X = 364, Y = 44, Sheet = 3926307971 }, - [96] = { X = 604, Y = 904, Sheet = 3926329330 }, - [48] = { X = 160, Y = 56, Sheet = 3926311105 }, - }, - text_format = { - [72] = { X = 232, Y = 232, Sheet = 3926316119 }, - [36] = { X = 804, Y = 804, Sheet = 3926305904 }, - [96] = { X = 204, Y = 904, Sheet = 3926319860 }, - [48] = { X = 264, Y = 576, Sheet = 3926307971 }, - }, - sentiment_dissatisfied = { - [72] = { X = 688, Y = 916, Sheet = 3926314806 }, - [36] = { X = 964, Y = 244, Sheet = 3926307971 }, - [96] = { X = 304, Y = 104, Sheet = 3926330123 }, - [48] = { X = 548, Y = 524, Sheet = 3926307971 }, - }, - hearing = { - [72] = { X = 80, Y = 764, Sheet = 3926317787 }, - [36] = { X = 564, Y = 804, Sheet = 3926305904 }, - [96] = { X = 804, Y = 904, Sheet = 3926334787 }, - [48] = { X = 732, Y = 888, Sheet = 3926307971 }, - }, - video_label = { - [48] = { X = 732, Y = 212, Sheet = 3926311105 }, - [36] = { X = 404, Y = 684, Sheet = 3926305904 }, - [72] = { X = 384, Y = 384, Sheet = 3926319099 }, - [96] = { X = 504, Y = 804, Sheet = 3926321212 }, - }, - perm_camera_mic = { - [72] = { X = 536, Y = 236, Sheet = 3926312257 }, - [36] = { X = 364, Y = 204, Sheet = 3926307971 }, - [96] = { X = 4, Y = 804, Sheet = 3926330123 }, - [48] = { X = 316, Y = 940, Sheet = 3926309567 }, - }, - lock = { - [48] = { X = 680, Y = 368, Sheet = 3926309567 }, - [36] = { X = 4, Y = 684, Sheet = 3926305904 }, - [72] = { X = 688, Y = 232, Sheet = 3926319099 }, - [96] = { X = 4, Y = 104, Sheet = 3926335698 }, - }, - person_add = { - [72] = { X = 536, Y = 612, Sheet = 3926313458 }, - [36] = { X = 404, Y = 204, Sheet = 3926307971 }, - [96] = { X = 804, Y = 704, Sheet = 3926330123 }, - [48] = { X = 576, Y = 836, Sheet = 3926309567 }, - }, - person_pin_circle = { - [72] = { X = 232, Y = 688, Sheet = 3926313458 }, - [36] = { X = 924, Y = 4, Sheet = 3926307971 }, - [96] = { X = 704, Y = 804, Sheet = 3926330123 }, - [48] = { X = 4, Y = 836, Sheet = 3926309567 }, - }, - last_page = { - [72] = { X = 536, Y = 460, Sheet = 3926316119 }, - [36] = { X = 484, Y = 84, Sheet = 3926305904 }, - [96] = { X = 804, Y = 204, Sheet = 3926333840 }, - [48] = { X = 160, Y = 56, Sheet = 3926309567 }, - }, - tablet = { - [72] = { X = 916, Y = 460, Sheet = 3926317787 }, - [36] = { X = 4, Y = 244, Sheet = 3926305904 }, - [96] = { X = 704, Y = 704, Sheet = 3926321212 }, - [48] = { X = 472, Y = 888, Sheet = 3926307971 }, - }, - border_style = { - [72] = { X = 308, Y = 536, Sheet = 3926314806 }, - [36] = { X = 484, Y = 244, Sheet = 3926307971 }, - [96] = { X = 4, Y = 604, Sheet = 3926329330 }, - [48] = { X = 784, Y = 4, Sheet = 3926311105 }, - }, - bluetooth_disabled = { - [72] = { X = 612, Y = 4, Sheet = 3926314806 }, - [36] = { X = 444, Y = 284, Sheet = 3926307971 }, - [96] = { X = 104, Y = 904, Sheet = 3926329330 }, - [48] = { X = 940, Y = 576, Sheet = 3926311105 }, - }, - attachment = { - [72] = { X = 156, Y = 460, Sheet = 3926313458 }, - [36] = { X = 124, Y = 444, Sheet = 3926307971 }, - [96] = { X = 604, Y = 204, Sheet = 3926327588 }, - [48] = { X = 732, Y = 472, Sheet = 3926311105 }, - }, - edit = { - [72] = { X = 384, Y = 156, Sheet = 3926316119 }, - [36] = { X = 924, Y = 364, Sheet = 3926305904 }, - [96] = { X = 704, Y = 504, Sheet = 3926326846 }, - [48] = { X = 784, Y = 836, Sheet = 3926311105 }, - }, - person_pin = { - [72] = { X = 384, Y = 612, Sheet = 3926313458 }, - [36] = { X = 524, Y = 44, Sheet = 3926307971 }, - [96] = { X = 404, Y = 904, Sheet = 3926330123 }, - [48] = { X = 212, Y = 836, Sheet = 3926309567 }, - }, - delete_sweep = { - [48] = { X = 680, Y = 4, Sheet = 3926311105 }, - [36] = { X = 644, Y = 644, Sheet = 3926305904 }, - [72] = { X = 688, Y = 308, Sheet = 3926319099 }, - [96] = { X = 4, Y = 204, Sheet = 3926326846 }, - }, - queue_music = { - [72] = { X = 840, Y = 80, Sheet = 3926313458 }, - [36] = { X = 4, Y = 324, Sheet = 3926307971 }, - [96] = { X = 604, Y = 504, Sheet = 3926333840 }, - [48] = { X = 368, Y = 472, Sheet = 3926309567 }, - }, - exposure = { - [72] = { X = 688, Y = 384, Sheet = 3926314806 }, - [36] = { X = 684, Y = 244, Sheet = 3926305904 }, - [96] = { X = 704, Y = 904, Sheet = 3926327588 }, - [48] = { X = 316, Y = 576, Sheet = 3926311105 }, - }, - border_horizontal = { - [72] = { X = 688, Y = 536, Sheet = 3926314806 }, - [36] = { X = 44, Y = 164, Sheet = 3926307971 }, - [96] = { X = 104, Y = 604, Sheet = 3926329330 }, - [48] = { X = 784, Y = 160, Sheet = 3926311105 }, - }, - perm_scan_wifi = { - [72] = { X = 80, Y = 612, Sheet = 3926313458 }, - [36] = { X = 524, Y = 204, Sheet = 3926307971 }, - [96] = { X = 904, Y = 804, Sheet = 3926330123 }, - [48] = { X = 576, Y = 940, Sheet = 3926309567 }, - }, - people_outline = { - [72] = { X = 840, Y = 464, Sheet = 3926312257 }, - [36] = { X = 764, Y = 124, Sheet = 3926307971 }, - [96] = { X = 104, Y = 504, Sheet = 3926330123 }, - [48] = { X = 680, Y = 940, Sheet = 3926309567 }, - }, - insert_comment = { - [72] = { X = 688, Y = 308, Sheet = 3926314806 }, - [36] = { X = 524, Y = 484, Sheet = 3926305904 }, - [96] = { X = 304, Y = 204, Sheet = 3926333840 }, - [48] = { X = 264, Y = 888, Sheet = 3926307971 }, - }, - wb_incandescent = { - [72] = { X = 612, Y = 308, Sheet = 3926313458 }, - [36] = { X = 4, Y = 444, Sheet = 3926307971 }, - [96] = { X = 304, Y = 4, Sheet = 3926319860 }, - [48] = { X = 628, Y = 524, Sheet = 3926311105 }, - }, - person = { - [72] = { X = 916, Y = 692, Sheet = 3926312257 }, - [36] = { X = 884, Y = 4, Sheet = 3926307971 }, - [96] = { X = 204, Y = 704, Sheet = 3926330123 }, - [48] = { X = 472, Y = 784, Sheet = 3926309567 }, - }, - pie_chart = { - [72] = { X = 384, Y = 688, Sheet = 3926314806 }, - [36] = { X = 564, Y = 324, Sheet = 3926307971 }, - [96] = { X = 504, Y = 604, Sheet = 3926330123 }, - [48] = { X = 628, Y = 524, Sheet = 3926309567 }, - }, - signal_wifi_off = { - [72] = { X = 536, Y = 764, Sheet = 3926314806 }, - [36] = { X = 884, Y = 324, Sheet = 3926305904 }, - [96] = { X = 804, Y = 304, Sheet = 3926319860 }, - [48] = { X = 160, Y = 108, Sheet = 3926309567 }, - }, - web = { - [72] = { X = 460, Y = 308, Sheet = 3926313458 }, - [36] = { X = 924, Y = 444, Sheet = 3926307971 }, - [96] = { X = 304, Y = 104, Sheet = 3926321212 }, - [48] = { X = 212, Y = 4, Sheet = 3926312257 }, - }, - perm_device_information = { - [72] = { X = 612, Y = 460, Sheet = 3926313458 }, - [36] = { X = 804, Y = 84, Sheet = 3926307971 }, - [96] = { X = 904, Y = 904, Sheet = 3926330123 }, - [48] = { X = 732, Y = 836, Sheet = 3926309567 }, - }, - personal_video = { - [72] = { X = 612, Y = 616, Sheet = 3926312257 }, - [36] = { X = 284, Y = 44, Sheet = 3926307971 }, - [96] = { X = 704, Y = 604, Sheet = 3926330123 }, - [48] = { X = 576, Y = 784, Sheet = 3926309567 }, - }, - compare_arrows = { - [48] = { X = 212, Y = 784, Sheet = 3926311105 }, - [36] = { X = 724, Y = 924, Sheet = 3926305904 }, - [72] = { X = 384, Y = 536, Sheet = 3926319099 }, - [96] = { X = 904, Y = 704, Sheet = 3926326846 }, - }, - first_page = { - [72] = { X = 612, Y = 916, Sheet = 3926317787 }, - [36] = { X = 764, Y = 804, Sheet = 3926305904 }, - [96] = { X = 604, Y = 104, Sheet = 3926327588 }, - [48] = { X = 4, Y = 264, Sheet = 3926311105 }, - }, - face = { - [72] = { X = 612, Y = 308, Sheet = 3926314806 }, - [36] = { X = 764, Y = 244, Sheet = 3926305904 }, - [96] = { X = 504, Y = 704, Sheet = 3926327588 }, - [48] = { X = 680, Y = 576, Sheet = 3926311105 }, - }, - pie_chart_outlined = { - [72] = { X = 916, Y = 460, Sheet = 3926314806 }, - [36] = { X = 644, Y = 364, Sheet = 3926307971 }, - [96] = { X = 104, Y = 304, Sheet = 3926329330 }, - [48] = { X = 576, Y = 576, Sheet = 3926309567 }, - }, - camera_enhance = { - [72] = { X = 4, Y = 540, Sheet = 3926312257 }, - [36] = { X = 644, Y = 884, Sheet = 3926305904 }, - [96] = { X = 604, Y = 404, Sheet = 3926328650 }, - [48] = { X = 628, Y = 836, Sheet = 3926311105 }, - }, - play_circle_outline = { - [72] = { X = 80, Y = 232, Sheet = 3926314806 }, - [36] = { X = 124, Y = 284, Sheet = 3926307971 }, - [96] = { X = 204, Y = 304, Sheet = 3926329330 }, - [48] = { X = 368, Y = 576, Sheet = 3926309567 }, - }, - picture_in_picture = { - [72] = { X = 80, Y = 536, Sheet = 3926314806 }, - [36] = { X = 284, Y = 364, Sheet = 3926307971 }, - [96] = { X = 4, Y = 304, Sheet = 3926329330 }, - [48] = { X = 264, Y = 732, Sheet = 3926309567 }, - }, - photo = { - [72] = { X = 308, Y = 688, Sheet = 3926314806 }, - [36] = { X = 84, Y = 164, Sheet = 3926307971 }, - [96] = { X = 504, Y = 304, Sheet = 3926329330 }, - [48] = { X = 784, Y = 524, Sheet = 3926309567 }, - }, - adb = { - [72] = { X = 764, Y = 460, Sheet = 3926313458 }, - [36] = { X = 164, Y = 4, Sheet = 3926307971 }, - [96] = { X = 204, Y = 904, Sheet = 3926328650 }, - [48] = { X = 264, Y = 160, Sheet = 3926312257 }, - }, - equalizer = { - [72] = { X = 4, Y = 156, Sheet = 3926316119 }, - [36] = { X = 164, Y = 124, Sheet = 3926305904 }, - [96] = { X = 804, Y = 504, Sheet = 3926326846 }, - [48] = { X = 212, Y = 888, Sheet = 3926311105 }, - }, - closed_caption = { - [72] = { X = 688, Y = 384, Sheet = 3926317787 }, - [36] = { X = 724, Y = 764, Sheet = 3926305904 }, - [96] = { X = 804, Y = 204, Sheet = 3926328650 }, - [48] = { X = 368, Y = 836, Sheet = 3926311105 }, - }, - play_for_work = { - [72] = { X = 384, Y = 4, Sheet = 3926314806 }, - [36] = { X = 84, Y = 324, Sheet = 3926307971 }, - [96] = { X = 504, Y = 204, Sheet = 3926329330 }, - [48] = { X = 628, Y = 368, Sheet = 3926309567 }, - }, - phone_missed = { - [72] = { X = 384, Y = 312, Sheet = 3926312257 }, - [36] = { X = 524, Y = 84, Sheet = 3926307971 }, - [96] = { X = 704, Y = 304, Sheet = 3926329330 }, - [48] = { X = 316, Y = 732, Sheet = 3926309567 }, - }, - backup = { - [72] = { X = 308, Y = 764, Sheet = 3926313458 }, - [36] = { X = 4, Y = 4, Sheet = 3926307971 }, - [96] = { X = 104, Y = 704, Sheet = 3926328650 }, - [48] = { X = 732, Y = 940, Sheet = 3926311105 }, - }, - settings_input_antenna = { - [72] = { X = 308, Y = 688, Sheet = 3926313458 }, - [36] = { X = 164, Y = 164, Sheet = 3926307971 }, - [96] = { X = 304, Y = 304, Sheet = 3926330123 }, - [48] = { X = 628, Y = 888, Sheet = 3926307971 }, - }, - switch_camera = { - [72] = { X = 764, Y = 308, Sheet = 3926314806 }, - [36] = { X = 444, Y = 84, Sheet = 3926305904 }, - [96] = { X = 804, Y = 4, Sheet = 3926319860 }, - [48] = { X = 940, Y = 160, Sheet = 3926309567 }, - }, - bug_report = { - [72] = { X = 156, Y = 688, Sheet = 3926313458 }, - [36] = { X = 444, Y = 44, Sheet = 3926307971 }, - [96] = { X = 804, Y = 704, Sheet = 3926329330 }, - [48] = { X = 108, Y = 4, Sheet = 3926311105 }, - }, - photo_size_select_small = { - [72] = { X = 916, Y = 612, Sheet = 3926314806 }, - [36] = { X = 964, Y = 124, Sheet = 3926307971 }, - [96] = { X = 704, Y = 404, Sheet = 3926329330 }, - [48] = { X = 888, Y = 524, Sheet = 3926309567 }, - }, - phone_in_talk = { - [72] = { X = 308, Y = 844, Sheet = 3926312257 }, - [36] = { X = 204, Y = 4, Sheet = 3926307971 }, - [96] = { X = 404, Y = 204, Sheet = 3926329330 }, - [48] = { X = 888, Y = 732, Sheet = 3926309567 }, - }, - create = { - [72] = { X = 536, Y = 80, Sheet = 3926317787 }, - [36] = { X = 284, Y = 644, Sheet = 3926305904 }, - [96] = { X = 504, Y = 904, Sheet = 3926326846 }, - [48] = { X = 888, Y = 368, Sheet = 3926311105 }, - }, - offline_pin = { - [72] = { X = 764, Y = 920, Sheet = 3926312257 }, - [36] = { X = 844, Y = 724, Sheet = 3926305904 }, - [96] = { X = 304, Y = 704, Sheet = 3926330123 }, - [48] = { X = 108, Y = 888, Sheet = 3926309567 }, - }, - playlist_add = { - [72] = { X = 308, Y = 80, Sheet = 3926314806 }, - [36] = { X = 204, Y = 284, Sheet = 3926307971 }, - [96] = { X = 504, Y = 404, Sheet = 3926329330 }, - [48] = { X = 264, Y = 368, Sheet = 3926309567 }, - }, - flight_land = { - [72] = { X = 536, Y = 384, Sheet = 3926316119 }, - [36] = { X = 124, Y = 244, Sheet = 3926305904 }, - [96] = { X = 804, Y = 404, Sheet = 3926326846 }, - [48] = { X = 524, Y = 316, Sheet = 3926311105 }, - }, - view_headline = { - [72] = { X = 232, Y = 692, Sheet = 3926312257 }, - [36] = { X = 284, Y = 964, Sheet = 3926305904 }, - [96] = { X = 404, Y = 704, Sheet = 3926319860 }, - [48] = { X = 524, Y = 836, Sheet = 3926311105 }, - }, - call_to_action = { - [72] = { X = 536, Y = 464, Sheet = 3926312257 }, - [36] = { X = 764, Y = 404, Sheet = 3926305904 }, - [96] = { X = 404, Y = 204, Sheet = 3926328650 }, - [48] = { X = 576, Y = 836, Sheet = 3926311105 }, - }, - playlist_add_check = { - [72] = { X = 80, Y = 80, Sheet = 3926314806 }, - [36] = { X = 324, Y = 284, Sheet = 3926307971 }, - [96] = { X = 804, Y = 404, Sheet = 3926329330 }, - [48] = { X = 56, Y = 420, Sheet = 3926309567 }, - }, - photo_size_select_large = { - [72] = { X = 536, Y = 840, Sheet = 3926314806 }, - [36] = { X = 484, Y = 124, Sheet = 3926307971 }, - [96] = { X = 204, Y = 404, Sheet = 3926329330 }, - [48] = { X = 4, Y = 576, Sheet = 3926309567 }, - }, - favorite = { - [72] = { X = 840, Y = 460, Sheet = 3926316119 }, - [36] = { X = 964, Y = 444, Sheet = 3926305904 }, - [96] = { X = 904, Y = 904, Sheet = 3926327588 }, - [48] = { X = 108, Y = 56, Sheet = 3926312257 }, - }, - data_usage = { - [72] = { X = 156, Y = 232, Sheet = 3926317787 }, - [36] = { X = 124, Y = 684, Sheet = 3926305904 }, - [96] = { X = 4, Y = 104, Sheet = 3926326846 }, - [48] = { X = 888, Y = 4, Sheet = 3926311105 }, - }, - notifications_active = { - [48] = { X = 160, Y = 836, Sheet = 3926309567 }, - [36] = { X = 324, Y = 924, Sheet = 3926305904 }, - [72] = { X = 916, Y = 688, Sheet = 3926319099 }, - [96] = { X = 4, Y = 904, Sheet = 3926330123 }, - }, - cancel = { - [36] = { X = 604, Y = 964, Sheet = 3926305904 }, - [24] = { X = 4, Y = 4, Size = 24, Sheet = 3926305904 }, - [96] = { X = 604, Y = 4, Sheet = 3926328650 }, - [72] = { X = 764, Y = 612, Sheet = 3926313458 }, - [48] = { X = 420, Y = 108, Sheet = 3926311105 }, - }, - comment = { - [72] = { X = 308, Y = 308, Sheet = 3926317787 }, - [36] = { X = 724, Y = 964, Sheet = 3926305904 }, - [96] = { X = 504, Y = 704, Sheet = 3926326846 }, - [48] = { X = 472, Y = 732, Sheet = 3926311105 }, - }, - close = { - [36] = { X = 164, Y = 804, Sheet = 3926305904 }, - [24] = { X = 284, Y = 4, Size = 24, Sheet = 3926305904 }, - [96] = { X = 304, Y = 304, Sheet = 3926328650 }, - [72] = { X = 384, Y = 460, Sheet = 3926317787 }, - [48] = { X = 368, Y = 160, Sheet = 3926311105 }, - }, - phone_locked = { - [72] = { X = 916, Y = 312, Sheet = 3926312257 }, - [36] = { X = 924, Y = 84, Sheet = 3926307971 }, - [96] = { X = 904, Y = 304, Sheet = 3926329330 }, - [48] = { X = 732, Y = 732, Sheet = 3926309567 }, - }, - local_bar = { - [72] = { X = 308, Y = 916, Sheet = 3926316119 }, - [36] = { X = 44, Y = 444, Sheet = 3926305904 }, - [96] = { X = 404, Y = 604, Sheet = 3926335698 }, - [48] = { X = 368, Y = 628, Sheet = 3926309567 }, - }, - crop_din = { - [72] = { X = 916, Y = 156, Sheet = 3926317787 }, - [36] = { X = 724, Y = 724, Sheet = 3926305904 }, - [96] = { X = 104, Y = 804, Sheet = 3926326846 }, - [48] = { X = 628, Y = 212, Sheet = 3926311105 }, - }, - phone_paused = { - [72] = { X = 688, Y = 768, Sheet = 3926312257 }, - [36] = { X = 644, Y = 84, Sheet = 3926307971 }, - [96] = { X = 104, Y = 404, Sheet = 3926329330 }, - [48] = { X = 524, Y = 888, Sheet = 3926309567 }, - }, - panorama_wide_angle = { - [72] = { X = 612, Y = 540, Sheet = 3926312257 }, - [36] = { X = 284, Y = 884, Sheet = 3926305904 }, - [96] = { X = 204, Y = 804, Sheet = 3926330123 }, - [48] = { X = 888, Y = 940, Sheet = 3926309567 }, - }, - brightness_3 = { - [72] = { X = 536, Y = 616, Sheet = 3926312257 }, - [36] = { X = 324, Y = 204, Sheet = 3926307971 }, - [96] = { X = 904, Y = 404, Sheet = 3926329330 }, - [48] = { X = 628, Y = 160, Sheet = 3926311105 }, - }, - battery_full = { - [72] = { X = 840, Y = 764, Sheet = 3926314806 }, - [36] = { X = 804, Y = 324, Sheet = 3926305904 }, - [96] = { X = 504, Y = 304, Sheet = 3926327588 }, - [48] = { X = 888, Y = 628, Sheet = 3926311105 }, - }, - battery_60 = { - [72] = { X = 840, Y = 916, Sheet = 3926313458 }, - [36] = { X = 564, Y = 404, Sheet = 3926307971 }, - [96] = { X = 804, Y = 604, Sheet = 3926328650 }, - [48] = { X = 316, Y = 888, Sheet = 3926311105 }, - }, - phonelink_setup = { - [72] = { X = 916, Y = 840, Sheet = 3926314806 }, - [36] = { X = 844, Y = 164, Sheet = 3926307971 }, - [96] = { X = 304, Y = 204, Sheet = 3926329330 }, - [48] = { X = 420, Y = 524, Sheet = 3926309567 }, - }, - developer_board = { - [48] = { X = 628, Y = 680, Sheet = 3926311105 }, - [36] = { X = 284, Y = 524, Sheet = 3926305904 }, - [72] = { X = 764, Y = 232, Sheet = 3926319099 }, - [96] = { X = 904, Y = 104, Sheet = 3926326846 }, - }, - whatshot = { - [72] = { X = 840, Y = 156, Sheet = 3926313458 }, - [36] = { X = 644, Y = 444, Sheet = 3926307971 }, - [96] = { X = 204, Y = 504, Sheet = 3926321212 }, - [48] = { X = 108, Y = 368, Sheet = 3926311105 }, - }, - keyboard_capslock = { - [72] = { X = 80, Y = 384, Sheet = 3926314806 }, - [36] = { X = 804, Y = 244, Sheet = 3926305904 }, - [96] = { X = 904, Y = 104, Sheet = 3926333840 }, - [48] = { X = 4, Y = 784, Sheet = 3926307971 }, - }, - map = { - [72] = { X = 840, Y = 80, Sheet = 3926317787 }, - [36] = { X = 84, Y = 724, Sheet = 3926305904 }, - [96] = { X = 304, Y = 4, Sheet = 3926334787 }, - [48] = { X = 680, Y = 576, Sheet = 3926309567 }, - }, - mood_bad = { - [72] = { X = 536, Y = 308, Sheet = 3926317787 }, - [36] = { X = 804, Y = 764, Sheet = 3926305904 }, - [96] = { X = 204, Y = 4, Sheet = 3926334787 }, - [48] = { X = 160, Y = 732, Sheet = 3926309567 }, - }, - phone_android = { - [72] = { X = 4, Y = 692, Sheet = 3926312257 }, - [36] = { X = 644, Y = 204, Sheet = 3926307971 }, - [96] = { X = 604, Y = 4, Sheet = 3926329330 }, - [48] = { X = 56, Y = 836, Sheet = 3926309567 }, - }, - phonelink_erase = { - [72] = { X = 536, Y = 920, Sheet = 3926312257 }, - [36] = { X = 84, Y = 4, Sheet = 3926307971 }, - [96] = { X = 904, Y = 4, Sheet = 3926329330 }, - [48] = { X = 368, Y = 680, Sheet = 3926309567 }, - }, -} diff --git a/src/IconLabel/Spritesheet/Sheet5.lua b/src/IconLabel/Spritesheet/Sheet5.lua deleted file mode 100644 index 638d9e45..00000000 --- a/src/IconLabel/Spritesheet/Sheet5.lua +++ /dev/null @@ -1,502 +0,0 @@ -return { - screen_share = { - [72] = { X = 612, Y = 80, Sheet = 3926314806 }, - [36] = { X = 164, Y = 364, Sheet = 3926305904 }, - [96] = { X = 104, Y = 104, Sheet = 3926330123 }, - [48] = { X = 212, Y = 680, Sheet = 3926307971 }, - }, - phonelink_lock = { - [72] = { X = 916, Y = 844, Sheet = 3926312257 }, - [36] = { X = 724, Y = 84, Sheet = 3926307971 }, - [96] = { X = 504, Y = 4, Sheet = 3926329330 }, - [48] = { X = 264, Y = 524, Sheet = 3926309567 }, - }, - grade = { - [72] = { X = 80, Y = 460, Sheet = 3926316119 }, - [36] = { X = 124, Y = 44, Sheet = 3926305904 }, - [96] = { X = 304, Y = 704, Sheet = 3926334787 }, - [48] = { X = 108, Y = 888, Sheet = 3926307971 }, - }, - donut_small = { - [72] = { X = 840, Y = 840, Sheet = 3926316119 }, - [36] = { X = 564, Y = 404, Sheet = 3926305904 }, - [96] = { X = 504, Y = 604, Sheet = 3926326846 }, - [48] = { X = 108, Y = 316, Sheet = 3926309567 }, - }, - layers_clear = { - [72] = { X = 156, Y = 764, Sheet = 3926316119 }, - [36] = { X = 684, Y = 84, Sheet = 3926305904 }, - [96] = { X = 704, Y = 404, Sheet = 3926333840 }, - [48] = { X = 4, Y = 108, Sheet = 3926309567 }, - }, - local_taxi = { - [48] = { X = 420, Y = 56, Sheet = 3926309567 }, - [36] = { X = 404, Y = 524, Sheet = 3926305904 }, - [72] = { X = 384, Y = 232, Sheet = 3926319099 }, - [96] = { X = 204, Y = 204, Sheet = 3926335698 }, - }, - photo_library = { - [72] = { X = 232, Y = 916, Sheet = 3926314806 }, - [36] = { X = 524, Y = 244, Sheet = 3926307971 }, - [96] = { X = 404, Y = 4, Sheet = 3926329330 }, - [48] = { X = 940, Y = 680, Sheet = 3926309567 }, - }, - view_agenda = { - [48] = { X = 316, Y = 940, Sheet = 3926311105 }, - [36] = { X = 124, Y = 804, Sheet = 3926305904 }, - [72] = { X = 80, Y = 460, Sheet = 3926319099 }, - [96] = { X = 504, Y = 704, Sheet = 3926319860 }, - }, - card_membership = { - [72] = { X = 460, Y = 768, Sheet = 3926312257 }, - [36] = { X = 644, Y = 964, Sheet = 3926305904 }, - [96] = { X = 204, Y = 4, Sheet = 3926328650 }, - [48] = { X = 472, Y = 108, Sheet = 3926311105 }, - }, - photo_camera = { - [72] = { X = 612, Y = 916, Sheet = 3926314806 }, - [36] = { X = 964, Y = 204, Sheet = 3926307971 }, - [96] = { X = 204, Y = 4, Sheet = 3926329330 }, - [48] = { X = 160, Y = 628, Sheet = 3926309567 }, - }, - flip_to_front = { - [72] = { X = 688, Y = 384, Sheet = 3926316119 }, - [36] = { X = 324, Y = 44, Sheet = 3926305904 }, - [96] = { X = 204, Y = 304, Sheet = 3926326846 }, - [48] = { X = 888, Y = 56, Sheet = 3926312257 }, - }, - photo_size_select_actual = { - [72] = { X = 156, Y = 916, Sheet = 3926314806 }, - [36] = { X = 444, Y = 244, Sheet = 3926307971 }, - [96] = { X = 104, Y = 104, Sheet = 3926329330 }, - [48] = { X = 628, Y = 472, Sheet = 3926309567 }, - }, - gesture = { - [72] = { X = 156, Y = 4, Sheet = 3926316119 }, - [36] = { X = 4, Y = 84, Sheet = 3926305904 }, - [96] = { X = 104, Y = 704, Sheet = 3926334787 }, - [48] = { X = 940, Y = 576, Sheet = 3926309567 }, - }, - signal_wifi_2_bar_lock = { - [72] = { X = 916, Y = 384, Sheet = 3926313458 }, - [36] = { X = 84, Y = 444, Sheet = 3926307971 }, - [96] = { X = 604, Y = 104, Sheet = 3926319860 }, - [48] = { X = 108, Y = 160, Sheet = 3926309567 }, - }, - more_horiz = { - [72] = { X = 612, Y = 232, Sheet = 3926317787 }, - [36] = { X = 4, Y = 804, Sheet = 3926305904 }, - [96] = { X = 704, Y = 404, Sheet = 3926334787 }, - [48] = { X = 680, Y = 680, Sheet = 3926309567 }, - }, - volume_off = { - [72] = { X = 840, Y = 460, Sheet = 3926314806 }, - [36] = { X = 4, Y = 404, Sheet = 3926307971 }, - [96] = { X = 604, Y = 604, Sheet = 3926321212 }, - [48] = { X = 108, Y = 732, Sheet = 3926311105 }, - }, - phonelink_off = { - [72] = { X = 460, Y = 920, Sheet = 3926312257 }, - [36] = { X = 524, Y = 4, Sheet = 3926307971 }, - [96] = { X = 4, Y = 204, Sheet = 3926329330 }, - [48] = { X = 108, Y = 524, Sheet = 3926309567 }, - }, - keyboard_tab = { - [72] = { X = 536, Y = 384, Sheet = 3926314806 }, - [36] = { X = 604, Y = 444, Sheet = 3926305904 }, - [96] = { X = 404, Y = 104, Sheet = 3926333840 }, - [48] = { X = 56, Y = 836, Sheet = 3926307971 }, - }, - brightness_auto = { - [72] = { X = 688, Y = 616, Sheet = 3926312257 }, - [36] = { X = 244, Y = 124, Sheet = 3926307971 }, - [96] = { X = 704, Y = 104, Sheet = 3926329330 }, - [48] = { X = 160, Y = 108, Sheet = 3926311105 }, - }, - picture_as_pdf = { - [72] = { X = 4, Y = 4, Sheet = 3926313458 }, - [36] = { X = 124, Y = 284, Sheet = 3926305904 }, - [96] = { X = 304, Y = 304, Sheet = 3926329330 }, - [48] = { X = 212, Y = 888, Sheet = 3926309567 }, - }, - brightness_7 = { - [72] = { X = 916, Y = 768, Sheet = 3926312257 }, - [36] = { X = 604, Y = 84, Sheet = 3926307971 }, - [96] = { X = 404, Y = 104, Sheet = 3926329330 }, - [48] = { X = 680, Y = 56, Sheet = 3926311105 }, - }, - event_seat = { - [72] = { X = 840, Y = 384, Sheet = 3926314806 }, - [36] = { X = 244, Y = 84, Sheet = 3926305904 }, - [96] = { X = 204, Y = 704, Sheet = 3926326846 }, - [48] = { X = 784, Y = 888, Sheet = 3926311105 }, - }, - video_library = { - [48] = { X = 368, Y = 4, Sheet = 3926311105 }, - [36] = { X = 164, Y = 724, Sheet = 3926305904 }, - [72] = { X = 4, Y = 764, Sheet = 3926319099 }, - [96] = { X = 304, Y = 504, Sheet = 3926321212 }, - }, - crop_square = { - [48] = { X = 264, Y = 212, Sheet = 3926311105 }, - [36] = { X = 884, Y = 644, Sheet = 3926305904 }, - [72] = { X = 536, Y = 688, Sheet = 3926319099 }, - [96] = { X = 204, Y = 4, Sheet = 3926326846 }, - }, - airline_seat_legroom_extra = { - [72] = { X = 460, Y = 688, Sheet = 3926314806 }, - [36] = { X = 404, Y = 324, Sheet = 3926307971 }, - [96] = { X = 504, Y = 104, Sheet = 3926328650 }, - [48] = { X = 888, Y = 264, Sheet = 3926311105 }, - }, - hourglass_empty = { - [72] = { X = 80, Y = 688, Sheet = 3926317787 }, - [36] = { X = 724, Y = 164, Sheet = 3926305904 }, - [96] = { X = 404, Y = 704, Sheet = 3926334787 }, - [48] = { X = 264, Y = 680, Sheet = 3926307971 }, - }, - insert_chart = { - [72] = { X = 612, Y = 612, Sheet = 3926316119 }, - [36] = { X = 284, Y = 444, Sheet = 3926305904 }, - [96] = { X = 804, Y = 104, Sheet = 3926333840 }, - [48] = { X = 368, Y = 732, Sheet = 3926307971 }, - }, - fiber_new = { - [72] = { X = 4, Y = 4, Sheet = 3926314806 }, - [36] = { X = 244, Y = 484, Sheet = 3926305904 }, - [96] = { X = 104, Y = 904, Sheet = 3926327588 }, - [48] = { X = 888, Y = 108, Sheet = 3926312257 }, - }, - clear = { - [72] = { X = 4, Y = 384, Sheet = 3926317787 }, - [36] = { X = 924, Y = 724, Sheet = 3926305904 }, - [96] = { X = 104, Y = 4, Sheet = 3926328650 }, - [48] = { X = 4, Y = 160, Sheet = 3926311105 }, - }, - brightness_6 = { - [72] = { X = 4, Y = 616, Sheet = 3926312257 }, - [36] = { X = 844, Y = 44, Sheet = 3926307971 }, - [96] = { X = 504, Y = 104, Sheet = 3926329330 }, - [48] = { X = 316, Y = 56, Sheet = 3926311105 }, - }, - border_vertical = { - [72] = { X = 688, Y = 688, Sheet = 3926314806 }, - [36] = { X = 684, Y = 164, Sheet = 3926307971 }, - [96] = { X = 4, Y = 504, Sheet = 3926329330 }, - [48] = { X = 316, Y = 212, Sheet = 3926311105 }, - }, - event_busy = { - [72] = { X = 156, Y = 840, Sheet = 3926316119 }, - [36] = { X = 564, Y = 84, Sheet = 3926305904 }, - [96] = { X = 204, Y = 604, Sheet = 3926326846 }, - [48] = { X = 836, Y = 836, Sheet = 3926311105 }, - }, - copyright = { - [48] = { X = 524, Y = 56, Sheet = 3926311105 }, - [36] = { X = 284, Y = 724, Sheet = 3926305904 }, - [72] = { X = 840, Y = 384, Sheet = 3926319099 }, - [96] = { X = 4, Y = 904, Sheet = 3926326846 }, - }, - center_focus_weak = { - [48] = { X = 680, Y = 368, Sheet = 3926311105 }, - [36] = { X = 684, Y = 564, Sheet = 3926305904 }, - [72] = { X = 384, Y = 156, Sheet = 3926319099 }, - [96] = { X = 904, Y = 4, Sheet = 3926328650 }, - }, - account_balance = { - [72] = { X = 308, Y = 388, Sheet = 3926312257 }, - [36] = { X = 484, Y = 44, Sheet = 3926307971 }, - [96] = { X = 404, Y = 904, Sheet = 3926328650 }, - [48] = { X = 732, Y = 420, Sheet = 3926311105 }, - }, - brush = { - [72] = { X = 916, Y = 612, Sheet = 3926313458 }, - [36] = { X = 804, Y = 4, Sheet = 3926307971 }, - [96] = { X = 404, Y = 804, Sheet = 3926329330 }, - [48] = { X = 316, Y = 4, Sheet = 3926311105 }, - }, - border_inner = { - [72] = { X = 4, Y = 916, Sheet = 3926314806 }, - [36] = { X = 644, Y = 124, Sheet = 3926307971 }, - [96] = { X = 804, Y = 604, Sheet = 3926329330 }, - [48] = { X = 888, Y = 160, Sheet = 3926311105 }, - }, - remove_red_eye = { - [72] = { X = 536, Y = 308, Sheet = 3926313458 }, - [36] = { X = 44, Y = 444, Sheet = 3926307971 }, - [96] = { X = 204, Y = 704, Sheet = 3926333840 }, - [48] = { X = 524, Y = 108, Sheet = 3926309567 }, - }, - search = { - [72] = { X = 156, Y = 536, Sheet = 3926314806 }, - [36] = { X = 964, Y = 324, Sheet = 3926305904 }, - [96] = { X = 204, Y = 104, Sheet = 3926330123 }, - [48] = { X = 628, Y = 576, Sheet = 3926307971 }, - }, - add_a_photo = { - [72] = { X = 536, Y = 536, Sheet = 3926313458 }, - [36] = { X = 44, Y = 124, Sheet = 3926307971 }, - [96] = { X = 704, Y = 504, Sheet = 3926328650 }, - [48] = { X = 160, Y = 420, Sheet = 3926311105 }, - }, - gps_fixed = { - [72] = { X = 80, Y = 384, Sheet = 3926316119 }, - [36] = { X = 764, Y = 44, Sheet = 3926305904 }, - [96] = { X = 504, Y = 504, Sheet = 3926334787 }, - [48] = { X = 680, Y = 732, Sheet = 3926307971 }, - }, - location_on = { - [48] = { X = 472, Y = 56, Sheet = 3926309567 }, - [36] = { X = 324, Y = 564, Sheet = 3926305904 }, - [72] = { X = 764, Y = 308, Sheet = 3926319099 }, - [96] = { X = 404, Y = 304, Sheet = 3926335698 }, - }, - brightness_5 = { - [72] = { X = 688, Y = 312, Sheet = 3926312257 }, - [36] = { X = 484, Y = 84, Sheet = 3926307971 }, - [96] = { X = 604, Y = 804, Sheet = 3926329330 }, - [48] = { X = 56, Y = 4, Sheet = 3926311105 }, - }, - filter_list = { - [72] = { X = 80, Y = 840, Sheet = 3926317787 }, - [36] = { X = 4, Y = 164, Sheet = 3926305904 }, - [96] = { X = 304, Y = 804, Sheet = 3926327588 }, - [48] = { X = 160, Y = 316, Sheet = 3926311105 }, - }, - view_list = { - [72] = { X = 232, Y = 536, Sheet = 3926313458 }, - [36] = { X = 964, Y = 964, Sheet = 3926305904 }, - [96] = { X = 604, Y = 864, Sheet = 3926319099 }, - [48] = { X = 680, Y = 108, Sheet = 3926311105 }, - }, - hot_tub = { - [72] = { X = 460, Y = 688, Sheet = 3926317787 }, - [36] = { X = 964, Y = 164, Sheet = 3926305904 }, - [96] = { X = 504, Y = 904, Sheet = 3926334787 }, - [48] = { X = 940, Y = 680, Sheet = 3926307971 }, - }, - shopping_cart = { - [36] = { X = 404, Y = 244, Sheet = 3926307971 }, - [24] = { X = 200, Y = 4, Size = 24, Sheet = 3926305904 }, - [96] = { X = 904, Y = 304, Sheet = 3926321212 }, - [72] = { X = 384, Y = 388, Sheet = 3926312257 }, - [48] = { X = 212, Y = 784, Sheet = 3926307971 }, - }, - no_sim = { - [48] = { X = 940, Y = 784, Sheet = 3926309567 }, - [36] = { X = 4, Y = 924, Sheet = 3926305904 }, - [72] = { X = 232, Y = 688, Sheet = 3926319099 }, - [96] = { X = 504, Y = 504, Sheet = 3926330123 }, - }, - keyboard_voice = { - [72] = { X = 384, Y = 460, Sheet = 3926314806 }, - [36] = { X = 644, Y = 444, Sheet = 3926305904 }, - [96] = { X = 904, Y = 4, Sheet = 3926333840 }, - [48] = { X = 108, Y = 784, Sheet = 3926307971 }, - }, - battery_charging_30 = { - [72] = { X = 4, Y = 232, Sheet = 3926313458 }, - [36] = { X = 404, Y = 324, Sheet = 3926305904 }, - [96] = { X = 704, Y = 604, Sheet = 3926328650 }, - [48] = { X = 680, Y = 888, Sheet = 3926311105 }, - }, - update = { - [48] = { X = 316, Y = 680, Sheet = 3926311105 }, - [36] = { X = 404, Y = 604, Sheet = 3926305904 }, - [72] = { X = 612, Y = 764, Sheet = 3926319099 }, - [96] = { X = 904, Y = 604, Sheet = 3926321212 }, - }, - filter_drama = { - [72] = { X = 840, Y = 460, Sheet = 3926317787 }, - [36] = { X = 924, Y = 204, Sheet = 3926305904 }, - [96] = { X = 304, Y = 104, Sheet = 3926327588 }, - [48] = { X = 56, Y = 472, Sheet = 3926311105 }, - }, - filter_tilt_shift = { - [72] = { X = 232, Y = 840, Sheet = 3926317787 }, - [36] = { X = 604, Y = 804, Sheet = 3926305904 }, - [96] = { X = 604, Y = 804, Sheet = 3926327588 }, - [48] = { X = 4, Y = 4, Sheet = 3926311105 }, - }, - info = { - [72] = { X = 460, Y = 612, Sheet = 3926316119 }, - [36] = { X = 524, Y = 444, Sheet = 3926305904 }, - [96] = { X = 304, Y = 104, Sheet = 3926333840 }, - [48] = { X = 888, Y = 628, Sheet = 3926307971 }, - }, - delete_forever = { - [48] = { X = 940, Y = 4, Sheet = 3926311105 }, - [36] = { X = 964, Y = 644, Sheet = 3926305904 }, - [72] = { X = 460, Y = 308, Sheet = 3926319099 }, - [96] = { X = 304, Y = 104, Sheet = 3926326846 }, - }, - bluetooth = { - [72] = { X = 764, Y = 4, Sheet = 3926314806 }, - [36] = { X = 364, Y = 324, Sheet = 3926307971 }, - [96] = { X = 604, Y = 704, Sheet = 3926329330 }, - [48] = { X = 576, Y = 680, Sheet = 3926311105 }, - }, - wifi = { - [72] = { X = 80, Y = 916, Sheet = 3926314806 }, - [36] = { X = 4, Y = 284, Sheet = 3926307971 }, - [96] = { X = 704, Y = 804, Sheet = 3926319860 }, - [48] = { X = 784, Y = 212, Sheet = 3926311105 }, - }, - arrow_back = { - [72] = { X = 840, Y = 232, Sheet = 3926313458 }, - [36] = { X = 124, Y = 324, Sheet = 3926307971 }, - [96] = { X = 404, Y = 504, Sheet = 3926328650 }, - [48] = { X = 524, Y = 160, Sheet = 3926312257 }, - }, - pages = { - [72] = { X = 460, Y = 688, Sheet = 3926313458 }, - [36] = { X = 444, Y = 924, Sheet = 3926305904 }, - [96] = { X = 404, Y = 504, Sheet = 3926330123 }, - [48] = { X = 160, Y = 888, Sheet = 3926309567 }, - }, - spellcheck = { - [48] = { X = 368, Y = 836, Sheet = 3926309567 }, - [36] = { X = 484, Y = 564, Sheet = 3926305904 }, - [72] = { X = 232, Y = 80, Sheet = 3926319099 }, - [96] = { X = 804, Y = 904, Sheet = 3926319860 }, - }, - plus_one = { - [72] = { X = 232, Y = 4, Sheet = 3926314806 }, - [36] = { X = 364, Y = 284, Sheet = 3926307971 }, - [96] = { X = 404, Y = 404, Sheet = 3926329330 }, - [48] = { X = 576, Y = 368, Sheet = 3926309567 }, - }, - looks_3 = { - [48] = { X = 940, Y = 368, Sheet = 3926309567 }, - [36] = { X = 84, Y = 684, Sheet = 3926305904 }, - [72] = { X = 156, Y = 232, Sheet = 3926319099 }, - [96] = { X = 104, Y = 104, Sheet = 3926335698 }, - }, - assistant_photo = { - [72] = { X = 460, Y = 232, Sheet = 3926313458 }, - [36] = { X = 804, Y = 284, Sheet = 3926307971 }, - [96] = { X = 804, Y = 4, Sheet = 3926327588 }, - [48] = { X = 368, Y = 524, Sheet = 3926311105 }, - }, - laptop_chromebook = { - [72] = { X = 840, Y = 308, Sheet = 3926314806 }, - [36] = { X = 164, Y = 84, Sheet = 3926305904 }, - [96] = { X = 904, Y = 204, Sheet = 3926333840 }, - [48] = { X = 732, Y = 160, Sheet = 3926309567 }, - }, - add_shopping_cart = { - [72] = { X = 916, Y = 236, Sheet = 3926312257 }, - [36] = { X = 444, Y = 124, Sheet = 3926307971 }, - [96] = { X = 104, Y = 904, Sheet = 3926328650 }, - [48] = { X = 108, Y = 264, Sheet = 3926311105 }, - }, - accessible = { - [72] = { X = 232, Y = 540, Sheet = 3926312257 }, - [36] = { X = 724, Y = 204, Sheet = 3926307971 }, - [96] = { X = 904, Y = 804, Sheet = 3926328650 }, - [48] = { X = 4, Y = 56, Sheet = 3926312257 }, - }, - bubble_chart = { - [72] = { X = 840, Y = 612, Sheet = 3926313458 }, - [36] = { X = 204, Y = 44, Sheet = 3926307971 }, - [96] = { X = 704, Y = 804, Sheet = 3926329330 }, - [48] = { X = 160, Y = 4, Sheet = 3926311105 }, - }, - receipt = { - [72] = { X = 384, Y = 916, Sheet = 3926313458 }, - [36] = { X = 804, Y = 404, Sheet = 3926307971 }, - [96] = { X = 204, Y = 604, Sheet = 3926333840 }, - [48] = { X = 524, Y = 160, Sheet = 3926309567 }, - }, - bookmark = { - [72] = { X = 688, Y = 460, Sheet = 3926314806 }, - [36] = { X = 724, Y = 364, Sheet = 3926307971 }, - [96] = { X = 804, Y = 804, Sheet = 3926329330 }, - [48] = { X = 4, Y = 628, Sheet = 3926311105 }, - }, - loop = { - [72] = { X = 840, Y = 384, Sheet = 3926317787 }, - [36] = { X = 244, Y = 684, Sheet = 3926305904 }, - [96] = { X = 104, Y = 204, Sheet = 3926334787 }, - [48] = { X = 4, Y = 420, Sheet = 3926309567 }, - }, - local_laundry_service = { - [48] = { X = 160, Y = 472, Sheet = 3926309567 }, - [36] = { X = 804, Y = 684, Sheet = 3926305904 }, - [72] = { X = 384, Y = 4, Sheet = 3926319099 }, - [96] = { X = 4, Y = 504, Sheet = 3926335698 }, - }, - navigate_next = { - [72] = { X = 916, Y = 80, Sheet = 3926317787 }, - [36] = { X = 444, Y = 844, Sheet = 3926305904 }, - [96] = { X = 804, Y = 4, Sheet = 3926334787 }, - [48] = { X = 680, Y = 888, Sheet = 3926309567 }, - }, - notifications = { - [48] = { X = 940, Y = 732, Sheet = 3926309567 }, - [36] = { X = 844, Y = 564, Sheet = 3926305904 }, - [72] = { X = 536, Y = 156, Sheet = 3926319099 }, - [96] = { X = 4, Y = 504, Sheet = 3926330123 }, - }, - star_border = { [36] = { X = 404, Y = 924, Sheet = 3926305904 }, [48] = { X = 732, Y = 784, Sheet = 3926309567 } }, - battery_charging_60 = { - [72] = { X = 80, Y = 840, Sheet = 3926313458 }, - [36] = { X = 124, Y = 324, Sheet = 3926305904 }, - [96] = { X = 204, Y = 304, Sheet = 3926327588 }, - [48] = { X = 160, Y = 316, Sheet = 3926309567 }, - }, - question_answer = { - [72] = { X = 80, Y = 232, Sheet = 3926313458 }, - [36] = { X = 644, Y = 324, Sheet = 3926305904 }, - [96] = { X = 804, Y = 504, Sheet = 3926333840 }, - [48] = { X = 212, Y = 472, Sheet = 3926309567 }, - }, - settings_overscan = { - [72] = { X = 232, Y = 236, Sheet = 3926312257 }, - [36] = { X = 124, Y = 124, Sheet = 3926307971 }, - [96] = { X = 804, Y = 304, Sheet = 3926330123 }, - [48] = { X = 212, Y = 628, Sheet = 3926309567 }, - }, - chevron_left = { - [48] = { X = 420, Y = 836, Sheet = 3926311105 }, - [36] = { X = 124, Y = 924, Sheet = 3926305904 }, - [72] = { X = 840, Y = 612, Sheet = 3926319099 }, - [96] = { X = 104, Y = 304, Sheet = 3926328650 }, - }, - add_alert = { - [72] = { X = 308, Y = 612, Sheet = 3926313458 }, - [36] = { X = 644, Y = 4, Sheet = 3926307971 }, - [96] = { X = 504, Y = 504, Sheet = 3926328650 }, - [48] = { X = 368, Y = 368, Sheet = 3926311105 }, - }, - local_printshop = { - [48] = { X = 732, Y = 264, Sheet = 3926309567 }, - [36] = { X = 484, Y = 604, Sheet = 3926305904 }, - [72] = { X = 384, Y = 612, Sheet = 3926319099 }, - [96] = { X = 4, Y = 204, Sheet = 3926335698 }, - }, - view_quilt = { - [72] = { X = 688, Y = 388, Sheet = 3926312257 }, - [36] = { X = 324, Y = 884, Sheet = 3926305904 }, - [96] = { X = 704, Y = 904, Sheet = 3926319860 }, - [48] = { X = 212, Y = 940, Sheet = 3926311105 }, - }, - brightness_1 = { - [72] = { X = 384, Y = 920, Sheet = 3926312257 }, - [36] = { X = 644, Y = 44, Sheet = 3926307971 }, - [96] = { X = 404, Y = 904, Sheet = 3926329330 }, - [48] = { X = 368, Y = 212, Sheet = 3926311105 }, - }, - do_not_disturb = { - [72] = { X = 460, Y = 916, Sheet = 3926316119 }, - [36] = { X = 764, Y = 844, Sheet = 3926305904 }, - [96] = { X = 704, Y = 404, Sheet = 3926321212 }, - [48] = { X = 56, Y = 316, Sheet = 3926309567 }, - }, - blur_on = { - [72] = { X = 460, Y = 916, Sheet = 3926314806 }, - [36] = { X = 564, Y = 364, Sheet = 3926307971 }, - [96] = { X = 804, Y = 904, Sheet = 3926329330 }, - [48] = { X = 420, Y = 680, Sheet = 3926311105 }, - }, -} diff --git a/src/IconLabel/Spritesheet/Sheet6.lua b/src/IconLabel/Spritesheet/Sheet6.lua deleted file mode 100644 index 414fadeb..00000000 --- a/src/IconLabel/Spritesheet/Sheet6.lua +++ /dev/null @@ -1,502 +0,0 @@ -return { - battery_unknown = { - [72] = { X = 460, Y = 460, Sheet = 3926314806 }, - [36] = { X = 84, Y = 364, Sheet = 3926305904 }, - [96] = { X = 504, Y = 604, Sheet = 3926328650 }, - [48] = { X = 680, Y = 316, Sheet = 3926309567 }, - }, - blur_linear = { - [72] = { X = 764, Y = 80, Sheet = 3926314806 }, - [36] = { X = 924, Y = 244, Sheet = 3926307971 }, - [96] = { X = 4, Y = 904, Sheet = 3926329330 }, - [48] = { X = 160, Y = 524, Sheet = 3926311105 }, - }, - help = { - [72] = { X = 916, Y = 764, Sheet = 3926317787 }, - [36] = { X = 924, Y = 164, Sheet = 3926305904 }, - [96] = { X = 804, Y = 704, Sheet = 3926334787 }, - [48] = { X = 316, Y = 888, Sheet = 3926307971 }, - }, - tram = { - [72] = { X = 80, Y = 612, Sheet = 3926316119 }, - [36] = { X = 84, Y = 404, Sheet = 3926305904 }, - [96] = { X = 904, Y = 404, Sheet = 3926321212 }, - [48] = { X = 56, Y = 4, Sheet = 3926312257 }, - }, - pan_tool = { - [72] = { X = 764, Y = 840, Sheet = 3926313458 }, - [36] = { X = 884, Y = 964, Sheet = 3926305904 }, - [96] = { X = 304, Y = 604, Sheet = 3926330123 }, - [48] = { X = 56, Y = 940, Sheet = 3926309567 }, - }, - font_download = { - [72] = { X = 80, Y = 80, Sheet = 3926316119 }, - [36] = { X = 944, Y = 4, Sheet = 3926305904 }, - [96] = { X = 4, Y = 404, Sheet = 3926326846 }, - [48] = { X = 4, Y = 472, Sheet = 3926311105 }, - }, - business = { - [72] = { X = 384, Y = 536, Sheet = 3926313458 }, - [36] = { X = 564, Y = 204, Sheet = 3926307971 }, - [96] = { X = 504, Y = 704, Sheet = 3926329330 }, - [48] = { X = 836, Y = 108, Sheet = 3926311105 }, - }, - speaker_group = { - [72] = { X = 308, Y = 540, Sheet = 3926312257 }, - [36] = { X = 844, Y = 124, Sheet = 3926307971 }, - [96] = { X = 604, Y = 504, Sheet = 3926319860 }, - [48] = { X = 732, Y = 940, Sheet = 3926309567 }, - }, - voicemail = { - [72] = { X = 536, Y = 536, Sheet = 3926314806 }, - [36] = { X = 844, Y = 84, Sheet = 3926307971 }, - [96] = { X = 504, Y = 4, Sheet = 3926319860 }, - [48] = { X = 732, Y = 108, Sheet = 3926311105 }, - }, - border_right = { - [72] = { X = 688, Y = 840, Sheet = 3926314806 }, - [36] = { X = 44, Y = 244, Sheet = 3926307971 }, - [96] = { X = 904, Y = 504, Sheet = 3926329330 }, - [48] = { X = 576, Y = 4, Sheet = 3926311105 }, - }, - border_bottom = { - [72] = { X = 460, Y = 612, Sheet = 3926314806 }, - [36] = { X = 684, Y = 364, Sheet = 3926307971 }, - [96] = { X = 804, Y = 504, Sheet = 3926329330 }, - [48] = { X = 4, Y = 732, Sheet = 3926311105 }, - }, - note_add = { - [48] = { X = 628, Y = 784, Sheet = 3926309567 }, - [36] = { X = 164, Y = 924, Sheet = 3926305904 }, - [72] = { X = 80, Y = 688, Sheet = 3926319099 }, - [96] = { X = 604, Y = 704, Sheet = 3926330123 }, - }, - perm_phone_msg = { - [72] = { X = 840, Y = 536, Sheet = 3926313458 }, - [36] = { X = 284, Y = 124, Sheet = 3926307971 }, - [96] = { X = 604, Y = 904, Sheet = 3926330123 }, - [48] = { X = 836, Y = 888, Sheet = 3926309567 }, - }, - flight = { - [36] = { X = 604, Y = 44, Sheet = 3926305904 }, - [24] = { X = 368, Y = 4, Size = 24, Sheet = 3926305904 }, - [96] = { X = 704, Y = 204, Sheet = 3926326846 }, - [72] = { X = 156, Y = 384, Sheet = 3926316119 }, - [48] = { X = 836, Y = 264, Sheet = 3926311105 }, - }, - exit_to_app = { - [72] = { X = 156, Y = 460, Sheet = 3926314806 }, - [36] = { X = 964, Y = 44, Sheet = 3926305904 }, - [96] = { X = 804, Y = 604, Sheet = 3926326846 }, - [48] = { X = 576, Y = 472, Sheet = 3926311105 }, - }, - hd = { - [72] = { X = 612, Y = 840, Sheet = 3926317787 }, - [36] = { X = 284, Y = 164, Sheet = 3926305904 }, - [96] = { X = 904, Y = 604, Sheet = 3926334787 }, - [48] = { X = 860, Y = 524, Sheet = 3926307971 }, - }, - folder_open = { - [72] = { X = 308, Y = 4, Sheet = 3926316119 }, - [36] = { X = 844, Y = 44, Sheet = 3926305904 }, - [96] = { X = 904, Y = 204, Sheet = 3926326846 }, - [48] = { X = 368, Y = 316, Sheet = 3926311105 }, - }, - blur_circular = { - [72] = { X = 764, Y = 156, Sheet = 3926314806 }, - [36] = { X = 524, Y = 284, Sheet = 3926307971 }, - [96] = { X = 604, Y = 504, Sheet = 3926329330 }, - [48] = { X = 212, Y = 524, Sheet = 3926311105 }, - }, - mic = { - [48] = { X = 472, Y = 888, Sheet = 3926309567 }, - [36] = { X = 204, Y = 724, Sheet = 3926305904 }, - [72] = { X = 536, Y = 536, Sheet = 3926319099 }, - [96] = { X = 204, Y = 804, Sheet = 3926334787 }, - }, - tablet_android = { - [72] = { X = 80, Y = 916, Sheet = 3926317787 }, - [36] = { X = 204, Y = 164, Sheet = 3926305904 }, - [96] = { X = 904, Y = 504, Sheet = 3926321212 }, - [48] = { X = 472, Y = 628, Sheet = 3926309567 }, - }, - format_bold = { - [72] = { X = 308, Y = 308, Sheet = 3926316119 }, - [36] = { X = 764, Y = 204, Sheet = 3926305904 }, - [96] = { X = 704, Y = 404, Sheet = 3926326846 }, - [48] = { X = 576, Y = 264, Sheet = 3926311105 }, - }, - money_off = { - [48] = { X = 160, Y = 576, Sheet = 3926309567 }, - [36] = { X = 44, Y = 884, Sheet = 3926305904 }, - [72] = { X = 384, Y = 460, Sheet = 3926319099 }, - [96] = { X = 504, Y = 104, Sheet = 3926334787 }, - }, - local_atm = { - [72] = { X = 688, Y = 840, Sheet = 3926316119 }, - [36] = { X = 964, Y = 404, Sheet = 3926305904 }, - [96] = { X = 104, Y = 704, Sheet = 3926335698 }, - [48] = { X = 628, Y = 212, Sheet = 3926309567 }, - }, - filter_hdr = { - [72] = { X = 460, Y = 840, Sheet = 3926317787 }, - [36] = { X = 844, Y = 124, Sheet = 3926305904 }, - [96] = { X = 704, Y = 104, Sheet = 3926327588 }, - [48] = { X = 264, Y = 420, Sheet = 3926311105 }, - }, - beach_access = { - [72] = { X = 232, Y = 764, Sheet = 3926314806 }, - [36] = { X = 44, Y = 284, Sheet = 3926305904 }, - [96] = { X = 604, Y = 604, Sheet = 3926328650 }, - [48] = { X = 628, Y = 316, Sheet = 3926309567 }, - }, - perm_media = { - [72] = { X = 916, Y = 840, Sheet = 3926313458 }, - [36] = { X = 964, Y = 44, Sheet = 3926307971 }, - [96] = { X = 304, Y = 904, Sheet = 3926330123 }, - [48] = { X = 940, Y = 836, Sheet = 3926309567 }, - }, - queue_play_next = { - [72] = { X = 764, Y = 156, Sheet = 3926313458 }, - [36] = { X = 164, Y = 404, Sheet = 3926307971 }, - [96] = { X = 4, Y = 604, Sheet = 3926333840 }, - [48] = { X = 940, Y = 420, Sheet = 3926309567 }, - }, - call_end = { - [72] = { X = 840, Y = 460, Sheet = 3926313458 }, - [36] = { X = 44, Y = 4, Sheet = 3926307971 }, - [96] = { X = 4, Y = 804, Sheet = 3926329330 }, - [48] = { X = 576, Y = 732, Sheet = 3926311105 }, - }, - place = { - [72] = { X = 384, Y = 840, Sheet = 3926314806 }, - [36] = { X = 804, Y = 364, Sheet = 3926307971 }, - [96] = { X = 204, Y = 604, Sheet = 3926330123 }, - [48] = { X = 420, Y = 576, Sheet = 3926309567 }, - }, - date_range = { - [48] = { X = 4, Y = 56, Sheet = 3926311105 }, - [36] = { X = 404, Y = 644, Sheet = 3926305904 }, - [72] = { X = 536, Y = 232, Sheet = 3926319099 }, - [96] = { X = 704, Y = 4, Sheet = 3926326846 }, - }, - movie_creation = { - [72] = { X = 156, Y = 308, Sheet = 3926317787 }, - [36] = { X = 164, Y = 964, Sheet = 3926305904 }, - [96] = { X = 604, Y = 304, Sheet = 3926334787 }, - [48] = { X = 836, Y = 680, Sheet = 3926309567 }, - }, - signal_wifi_1_bar_lock = { - [72] = { X = 612, Y = 384, Sheet = 3926313458 }, - [36] = { X = 724, Y = 284, Sheet = 3926307971 }, - [96] = { X = 704, Y = 4, Sheet = 3926319860 }, - [48] = { X = 368, Y = 4, Sheet = 3926309567 }, - }, - forward_30 = { - [72] = { X = 460, Y = 612, Sheet = 3926317787 }, - [36] = { X = 364, Y = 244, Sheet = 3926305904 }, - [96] = { X = 604, Y = 604, Sheet = 3926327588 }, - [48] = { X = 888, Y = 836, Sheet = 3926307971 }, - }, - call_merge = { - [72] = { X = 680, Y = 160, Sheet = 3926312257 }, - [36] = { X = 884, Y = 164, Sheet = 3926307971 }, - [96] = { X = 304, Y = 604, Sheet = 3926329330 }, - [48] = { X = 524, Y = 732, Sheet = 3926311105 }, - }, - apps = { - [72] = { X = 916, Y = 688, Sheet = 3926313458 }, - [36] = { X = 724, Y = 244, Sheet = 3926307971 }, - [96] = { X = 404, Y = 804, Sheet = 3926328650 }, - [48] = { X = 576, Y = 56, Sheet = 3926312257 }, - }, - border_color = { - [72] = { X = 612, Y = 688, Sheet = 3926314806 }, - [36] = { X = 4, Y = 164, Sheet = 3926307971 }, - [96] = { X = 404, Y = 504, Sheet = 3926329330 }, - [48] = { X = 784, Y = 680, Sheet = 3926311105 }, - }, - insert_photo = { - [72] = { X = 916, Y = 460, Sheet = 3926316119 }, - [36] = { X = 644, Y = 484, Sheet = 3926305904 }, - [96] = { X = 4, Y = 4, Sheet = 3926333840 }, - [48] = { X = 524, Y = 784, Sheet = 3926307971 }, - }, - battery_charging_50 = { - [72] = { X = 4, Y = 840, Sheet = 3926313458 }, - [36] = { X = 444, Y = 324, Sheet = 3926305904 }, - [96] = { X = 404, Y = 604, Sheet = 3926328650 }, - [48] = { X = 4, Y = 4, Sheet = 3926309567 }, - }, - speaker_notes = { - [72] = { X = 916, Y = 536, Sheet = 3926313458 }, - [36] = { X = 404, Y = 884, Sheet = 3926305904 }, - [96] = { X = 904, Y = 704, Sheet = 3926319860 }, - [48] = { X = 160, Y = 940, Sheet = 3926309567 }, - }, - call_missed_outgoing = { - [72] = { X = 840, Y = 236, Sheet = 3926312257 }, - [36] = { X = 244, Y = 244, Sheet = 3926307971 }, - [96] = { X = 4, Y = 704, Sheet = 3926329330 }, - [48] = { X = 732, Y = 732, Sheet = 3926311105 }, - }, - vpn_lock = { - [72] = { X = 916, Y = 688, Sheet = 3926314806 }, - [36] = { X = 404, Y = 284, Sheet = 3926307971 }, - [96] = { X = 904, Y = 204, Sheet = 3926319860 }, - [48] = { X = 888, Y = 316, Sheet = 3926309567 }, - }, - arrow_downward = { - [72] = { X = 384, Y = 460, Sheet = 3926313458 }, - [36] = { X = 204, Y = 484, Sheet = 3926307971 }, - [96] = { X = 704, Y = 404, Sheet = 3926327588 }, - [48] = { X = 420, Y = 4, Sheet = 3926312257 }, - }, - loyalty = { - [72] = { X = 308, Y = 80, Sheet = 3926317787 }, - [36] = { X = 324, Y = 644, Sheet = 3926305904 }, - [96] = { X = 704, Y = 104, Sheet = 3926334787 }, - [48] = { X = 264, Y = 576, Sheet = 3926309567 }, - }, - branding_watermark = { - [72] = { X = 840, Y = 920, Sheet = 3926312257 }, - [36] = { X = 604, Y = 164, Sheet = 3926307971 }, - [96] = { X = 904, Y = 904, Sheet = 3926329330 }, - [48] = { X = 212, Y = 212, Sheet = 3926311105 }, - }, - call_received = { - [72] = { X = 460, Y = 464, Sheet = 3926312257 }, - [36] = { X = 364, Y = 244, Sheet = 3926307971 }, - [96] = { X = 904, Y = 304, Sheet = 3926328650 }, - [48] = { X = 56, Y = 940, Sheet = 3926311105 }, - }, - done = { - [72] = { X = 232, Y = 536, Sheet = 3926316119 }, - [36] = { X = 644, Y = 204, Sheet = 3926305904 }, - [96] = { X = 504, Y = 404, Sheet = 3926321212 }, - [48] = { X = 628, Y = 628, Sheet = 3926311105 }, - }, - event_note = { - [72] = { X = 4, Y = 840, Sheet = 3926316119 }, - [36] = { X = 404, Y = 84, Sheet = 3926305904 }, - [96] = { X = 604, Y = 604, Sheet = 3926326846 }, - [48] = { X = 4, Y = 888, Sheet = 3926311105 }, - }, - format_underlined = { - [72] = { X = 840, Y = 384, Sheet = 3926316119 }, - [36] = { X = 564, Y = 124, Sheet = 3926305904 }, - [96] = { X = 504, Y = 604, Sheet = 3926327588 }, - [48] = { X = 160, Y = 784, Sheet = 3926307971 }, - }, - palette = { - [72] = { X = 612, Y = 612, Sheet = 3926313458 }, - [36] = { X = 804, Y = 964, Sheet = 3926305904 }, - [96] = { X = 304, Y = 504, Sheet = 3926330123 }, - [48] = { X = 524, Y = 940, Sheet = 3926309567 }, - }, - camera_alt = { - [72] = { X = 536, Y = 540, Sheet = 3926312257 }, - [36] = { X = 364, Y = 884, Sheet = 3926305904 }, - [96] = { X = 404, Y = 404, Sheet = 3926328650 }, - [48] = { X = 940, Y = 732, Sheet = 3926311105 }, - }, - signal_wifi_3_bar = { - [72] = { X = 612, Y = 80, Sheet = 3926313458 }, - [36] = { X = 284, Y = 404, Sheet = 3926307971 }, - [96] = { X = 304, Y = 704, Sheet = 3926321212 }, - [48] = { X = 316, Y = 472, Sheet = 3926309567 }, - }, - bluetooth_connected = { - [72] = { X = 156, Y = 4, Sheet = 3926314806 }, - [36] = { X = 484, Y = 324, Sheet = 3926307971 }, - [96] = { X = 104, Y = 104, Sheet = 3926328650 }, - [48] = { X = 420, Y = 628, Sheet = 3926311105 }, - }, - traffic = { - [72] = { X = 688, Y = 612, Sheet = 3926316119 }, - [36] = { X = 924, Y = 444, Sheet = 3926305904 }, - [96] = { X = 304, Y = 4, Sheet = 3926321212 }, - [48] = { X = 316, Y = 56, Sheet = 3926312257 }, - }, - airline_seat_legroom_normal = { - [72] = { X = 688, Y = 612, Sheet = 3926314806 }, - [36] = { X = 484, Y = 284, Sheet = 3926307971 }, - [96] = { X = 904, Y = 104, Sheet = 3926328650 }, - [48] = { X = 108, Y = 316, Sheet = 3926311105 }, - }, - airplanemode_inactive = { - [72] = { X = 308, Y = 4, Sheet = 3926314806 }, - [36] = { X = 884, Y = 324, Sheet = 3926307971 }, - [96] = { X = 204, Y = 204, Sheet = 3926328650 }, - [48] = { X = 472, Y = 108, Sheet = 3926312257 }, - }, - mic_none = { - [48] = { X = 368, Y = 888, Sheet = 3926309567 }, - [36] = { X = 364, Y = 644, Sheet = 3926305904 }, - [72] = { X = 612, Y = 384, Sheet = 3926319099 }, - [96] = { X = 304, Y = 804, Sheet = 3926334787 }, - }, - zoom_in = { - [72] = { X = 764, Y = 464, Sheet = 3926312257 }, - [36] = { X = 364, Y = 124, Sheet = 3926307971 }, - [96] = { X = 904, Y = 504, Sheet = 3926319860 }, - [48] = { X = 680, Y = 264, Sheet = 3926311105 }, - }, - airline_seat_flat = { - [72] = { X = 536, Y = 916, Sheet = 3926314806 }, - [36] = { X = 844, Y = 244, Sheet = 3926307971 }, - [96] = { X = 704, Y = 104, Sheet = 3926328650 }, - [48] = { X = 784, Y = 316, Sheet = 3926311105 }, - }, - screen_rotation = { - [72] = { X = 916, Y = 156, Sheet = 3926314806 }, - [36] = { X = 484, Y = 324, Sheet = 3926305904 }, - [96] = { X = 404, Y = 4, Sheet = 3926330123 }, - [48] = { X = 368, Y = 680, Sheet = 3926307971 }, - }, - leak_add = { - [72] = { X = 536, Y = 764, Sheet = 3926316119 }, - [36] = { X = 844, Y = 84, Sheet = 3926305904 }, - [96] = { X = 604, Y = 204, Sheet = 3926333840 }, - [48] = { X = 264, Y = 4, Sheet = 3926309567 }, - }, - mic_off = { - [48] = { X = 212, Y = 732, Sheet = 3926309567 }, - [36] = { X = 324, Y = 724, Sheet = 3926305904 }, - [72] = { X = 688, Y = 460, Sheet = 3926319099 }, - [96] = { X = 404, Y = 804, Sheet = 3926334787 }, - }, - airline_seat_individual_suite = { - [72] = { X = 232, Y = 536, Sheet = 3926314806 }, - [36] = { X = 764, Y = 44, Sheet = 3926307971 }, - [96] = { X = 404, Y = 104, Sheet = 3926328650 }, - [48] = { X = 56, Y = 264, Sheet = 3926311105 }, - }, - account_box = { - [72] = { X = 832, Y = 160, Sheet = 3926312257 }, - [36] = { X = 124, Y = 44, Sheet = 3926307971 }, - [96] = { X = 904, Y = 904, Sheet = 3926328650 }, - [48] = { X = 524, Y = 264, Sheet = 3926311105 }, - }, - slideshow = { - [72] = { X = 612, Y = 840, Sheet = 3926314806 }, - [36] = { X = 924, Y = 124, Sheet = 3926307971 }, - [96] = { X = 404, Y = 4, Sheet = 3926319860 }, - [48] = { X = 108, Y = 576, Sheet = 3926309567 }, - }, - toys = { - [72] = { X = 840, Y = 536, Sheet = 3926317787 }, - [36] = { X = 764, Y = 164, Sheet = 3926305904 }, - [96] = { X = 604, Y = 504, Sheet = 3926321212 }, - [48] = { X = 420, Y = 264, Sheet = 3926311105 }, - }, - expand_less = { - [72] = { X = 688, Y = 232, Sheet = 3926314806 }, - [36] = { X = 44, Y = 404, Sheet = 3926305904 }, - [96] = { X = 304, Y = 604, Sheet = 3926326846 }, - [48] = { X = 940, Y = 472, Sheet = 3926311105 }, - }, - ["3d_rotation"] = { - [72] = { X = 156, Y = 312, Sheet = 3926312257 }, - [36] = { X = 884, Y = 124, Sheet = 3926307971 }, - [96] = { X = 504, Y = 904, Sheet = 3926328650 }, - [48] = { X = 212, Y = 56, Sheet = 3926312257 }, - }, - filter_none = { - [72] = { X = 840, Y = 688, Sheet = 3926317787 }, - [36] = { X = 44, Y = 164, Sheet = 3926305904 }, - [96] = { X = 104, Y = 804, Sheet = 3926327588 }, - [48] = { X = 368, Y = 108, Sheet = 3926312257 }, - }, - star_rate = { [36] = { X = 564, Y = 764, Sheet = 3926305904 } }, - subway = { - [72] = { X = 384, Y = 764, Sheet = 3926316119 }, - [36] = { X = 804, Y = 524, Sheet = 3926305904 }, - [96] = { X = 204, Y = 404, Sheet = 3926319860 }, - [48] = { X = 628, Y = 108, Sheet = 3926309567 }, - }, - archive = { - [72] = { X = 536, Y = 80, Sheet = 3926313458 }, - [36] = { X = 524, Y = 484, Sheet = 3926307971 }, - [96] = { X = 4, Y = 504, Sheet = 3926328650 }, - [48] = { X = 160, Y = 160, Sheet = 3926312257 }, - }, - texture = { - [72] = { X = 384, Y = 4, Sheet = 3926316119 }, - [36] = { X = 524, Y = 44, Sheet = 3926305904 }, - [96] = { X = 904, Y = 604, Sheet = 3926319860 }, - [48] = { X = 576, Y = 628, Sheet = 3926309567 }, - }, - fullscreen_exit = { - [72] = { X = 688, Y = 308, Sheet = 3926316119 }, - [36] = { X = 244, Y = 204, Sheet = 3926305904 }, - [96] = { X = 704, Y = 604, Sheet = 3926327588 }, - [48] = { X = 212, Y = 732, Sheet = 3926307971 }, - }, - swap_vert = { - [72] = { X = 916, Y = 764, Sheet = 3926316119 }, - [36] = { X = 204, Y = 124, Sheet = 3926305904 }, - [96] = { X = 204, Y = 204, Sheet = 3926319860 }, - [48] = { X = 524, Y = 4, Sheet = 3926309567 }, - }, - add_alarm = { - [72] = { X = 460, Y = 612, Sheet = 3926313458 }, - [36] = { X = 604, Y = 4, Sheet = 3926307971 }, - [96] = { X = 904, Y = 504, Sheet = 3926328650 }, - [48] = { X = 576, Y = 368, Sheet = 3926311105 }, - }, - border_clear = { - [72] = { X = 840, Y = 612, Sheet = 3926314806 }, - [36] = { X = 884, Y = 364, Sheet = 3926307971 }, - [96] = { X = 304, Y = 504, Sheet = 3926329330 }, - [48] = { X = 56, Y = 680, Sheet = 3926311105 }, - }, - toc = { - [72] = { X = 308, Y = 840, Sheet = 3926317787 }, - [36] = { X = 884, Y = 804, Sheet = 3926305904 }, - [96] = { X = 904, Y = 904, Sheet = 3926319860 }, - [48] = { X = 836, Y = 316, Sheet = 3926311105 }, - }, - settings_phone = { - [72] = { X = 4, Y = 388, Sheet = 3926312257 }, - [36] = { X = 804, Y = 204, Sheet = 3926307971 }, - [96] = { X = 704, Y = 304, Sheet = 3926330123 }, - [48] = { X = 732, Y = 680, Sheet = 3926307971 }, - }, - free_breakfast = { - [72] = { X = 612, Y = 612, Sheet = 3926317787 }, - [36] = { X = 204, Y = 204, Sheet = 3926305904 }, - [96] = { X = 204, Y = 704, Sheet = 3926327588 }, - [48] = { X = 784, Y = 784, Sheet = 3926307971 }, - }, - directions_bus = { - [48] = { X = 264, Y = 524, Sheet = 3926311105 }, - [36] = { X = 764, Y = 604, Sheet = 3926305904 }, - [72] = { X = 460, Y = 4, Sheet = 3926319099 }, - [96] = { X = 704, Y = 204, Sheet = 3926321212 }, - }, - lock_open = { - [48] = { X = 680, Y = 56, Sheet = 3926309567 }, - [36] = { X = 964, Y = 684, Sheet = 3926305904 }, - [72] = { X = 916, Y = 308, Sheet = 3926319099 }, - [96] = { X = 104, Y = 604, Sheet = 3926335698 }, - }, - history = { - [72] = { X = 764, Y = 460, Sheet = 3926317787 }, - [36] = { X = 44, Y = 244, Sheet = 3926305904 }, - [96] = { X = 704, Y = 804, Sheet = 3926334787 }, - [48] = { X = 888, Y = 576, Sheet = 3926307971 }, - }, - location_off = { - [48] = { X = 576, Y = 56, Sheet = 3926309567 }, - [36] = { X = 244, Y = 604, Sheet = 3926305904 }, - [72] = { X = 384, Y = 308, Sheet = 3926319099 }, - [96] = { X = 4, Y = 4, Sheet = 3926335698 }, - }, - directions_bike = { - [48] = { X = 524, Y = 680, Sheet = 3926311105 }, - [36] = { X = 644, Y = 604, Sheet = 3926305904 }, - [72] = { X = 384, Y = 764, Sheet = 3926319099 }, - [96] = { X = 504, Y = 204, Sheet = 3926321212 }, - }, -} diff --git a/src/IconLabel/Spritesheet/Sheet7.lua b/src/IconLabel/Spritesheet/Sheet7.lua deleted file mode 100644 index 679e66c4..00000000 --- a/src/IconLabel/Spritesheet/Sheet7.lua +++ /dev/null @@ -1,506 +0,0 @@ -return { - child_care = { - [48] = { X = 888, Y = 108, Sheet = 3926311105 }, - [36] = { X = 844, Y = 884, Sheet = 3926305904 }, - [72] = { X = 688, Y = 156, Sheet = 3926319099 }, - [96] = { X = 904, Y = 604, Sheet = 3926329330 }, - }, - videocam = { - [48] = { X = 316, Y = 732, Sheet = 3926311105 }, - [36] = { X = 684, Y = 764, Sheet = 3926305904 }, - [72] = { X = 840, Y = 536, Sheet = 3926319099 }, - [96] = { X = 304, Y = 904, Sheet = 3926321212 }, - }, - album = { - [72] = { X = 612, Y = 764, Sheet = 3926313458 }, - [36] = { X = 524, Y = 404, Sheet = 3926307971 }, - [96] = { X = 504, Y = 804, Sheet = 3926328650 }, - [48] = { X = 368, Y = 264, Sheet = 3926311105 }, - }, - local_see = { - [48] = { X = 784, Y = 264, Sheet = 3926309567 }, - [36] = { X = 564, Y = 604, Sheet = 3926305904 }, - [72] = { X = 308, Y = 688, Sheet = 3926319099 }, - [96] = { X = 104, Y = 204, Sheet = 3926335698 }, - }, - line_style = { - [72] = { X = 688, Y = 80, Sheet = 3926316119 }, - [36] = { X = 844, Y = 364, Sheet = 3926305904 }, - [96] = { X = 704, Y = 304, Sheet = 3926333840 }, - [48] = { X = 940, Y = 108, Sheet = 3926309567 }, - }, - all_out = { - [72] = { X = 232, Y = 840, Sheet = 3926313458 }, - [36] = { X = 364, Y = 84, Sheet = 3926307971 }, - [96] = { X = 104, Y = 804, Sheet = 3926328650 }, - [48] = { X = 836, Y = 420, Sheet = 3926311105 }, - }, - tune = { - [72] = { X = 4, Y = 232, Sheet = 3926316119 }, - [36] = { X = 4, Y = 124, Sheet = 3926305904 }, - [96] = { X = 904, Y = 304, Sheet = 3926319860 }, - [48] = { X = 420, Y = 888, Sheet = 3926311105 }, - }, - keyboard = { - [72] = { X = 612, Y = 232, Sheet = 3926314806 }, - [36] = { X = 724, Y = 444, Sheet = 3926305904 }, - [96] = { X = 804, Y = 4, Sheet = 3926333840 }, - [48] = { X = 4, Y = 680, Sheet = 3926309567 }, - }, - skip_previous = { - [72] = { X = 764, Y = 612, Sheet = 3926314806 }, - [36] = { X = 364, Y = 364, Sheet = 3926307971 }, - [96] = { X = 4, Y = 204, Sheet = 3926319860 }, - [48] = { X = 420, Y = 888, Sheet = 3926309567 }, - }, - format_list_bulleted = { - [72] = { X = 916, Y = 232, Sheet = 3926316119 }, - [36] = { X = 484, Y = 204, Sheet = 3926305904 }, - [96] = { X = 304, Y = 504, Sheet = 3926327588 }, - [48] = { X = 628, Y = 160, Sheet = 3926312257 }, - }, - golf_course = { - [72] = { X = 840, Y = 4, Sheet = 3926316119 }, - [36] = { X = 44, Y = 44, Sheet = 3926305904 }, - [96] = { X = 4, Y = 504, Sheet = 3926334787 }, - [48] = { X = 316, Y = 680, Sheet = 3926307971 }, - }, - nature = { - [72] = { X = 764, Y = 308, Sheet = 3926317787 }, - [36] = { X = 564, Y = 844, Sheet = 3926305904 }, - [96] = { X = 704, Y = 4, Sheet = 3926334787 }, - [48] = { X = 420, Y = 680, Sheet = 3926309567 }, - }, - add_location = { - [72] = { X = 460, Y = 844, Sheet = 3926312257 }, - [36] = { X = 844, Y = 204, Sheet = 3926307971 }, - [96] = { X = 604, Y = 704, Sheet = 3926328650 }, - [48] = { X = 420, Y = 108, Sheet = 3926312257 }, - }, - subscriptions = { - [48] = { X = 4, Y = 472, Sheet = 3926309567 }, - [36] = { X = 684, Y = 524, Sheet = 3926305904 }, - [72] = { X = 308, Y = 384, Sheet = 3926319099 }, - [96] = { X = 4, Y = 304, Sheet = 3926319860 }, - }, - add = { - [72] = { X = 840, Y = 840, Sheet = 3926313458 }, - [36] = { X = 324, Y = 364, Sheet = 3926307971 }, - [96] = { X = 804, Y = 704, Sheet = 3926328650 }, - [48] = { X = 680, Y = 316, Sheet = 3926311105 }, - }, - battery_30 = { - [72] = { X = 612, Y = 840, Sheet = 3926313458 }, - [36] = { X = 884, Y = 404, Sheet = 3926307971 }, - [96] = { X = 204, Y = 604, Sheet = 3926328650 }, - [48] = { X = 420, Y = 940, Sheet = 3926311105 }, - }, - account_balance_wallet = { - [72] = { X = 80, Y = 540, Sheet = 3926312257 }, - [36] = { X = 604, Y = 44, Sheet = 3926307971 }, - [96] = { X = 704, Y = 804, Sheet = 3926328650 }, - [48] = { X = 160, Y = 56, Sheet = 3926312257 }, - }, - cloud_circle = { - [72] = { X = 840, Y = 156, Sheet = 3926317787 }, - [36] = { X = 164, Y = 764, Sheet = 3926305904 }, - [96] = { X = 904, Y = 204, Sheet = 3926328650 }, - [48] = { X = 108, Y = 940, Sheet = 3926311105 }, - }, - language = { - [72] = { X = 764, Y = 384, Sheet = 3926314806 }, - [36] = { X = 924, Y = 44, Sheet = 3926305904 }, - [96] = { X = 604, Y = 304, Sheet = 3926333840 }, - [48] = { X = 368, Y = 108, Sheet = 3926309567 }, - }, - phone_bluetooth_speaker = { - [72] = { X = 4, Y = 768, Sheet = 3926312257 }, - [36] = { X = 84, Y = 204, Sheet = 3926307971 }, - [96] = { X = 4, Y = 104, Sheet = 3926329330 }, - [48] = { X = 108, Y = 784, Sheet = 3926309567 }, - }, - restore_page = { - [72] = { X = 460, Y = 80, Sheet = 3926313458 }, - [36] = { X = 124, Y = 484, Sheet = 3926307971 }, - [96] = { X = 804, Y = 804, Sheet = 3926333840 }, - [48] = { X = 940, Y = 784, Sheet = 3926307971 }, - }, - accessibility = { - [72] = { X = 908, Y = 160, Sheet = 3926312257 }, - [36] = { X = 164, Y = 124, Sheet = 3926307971 }, - [96] = { X = 604, Y = 904, Sheet = 3926328650 }, - [48] = { X = 420, Y = 160, Sheet = 3926312257 }, - }, - remove_from_queue = { - [72] = { X = 308, Y = 460, Sheet = 3926313458 }, - [36] = { X = 164, Y = 444, Sheet = 3926307971 }, - [96] = { X = 304, Y = 704, Sheet = 3926333840 }, - [48] = { X = 160, Y = 160, Sheet = 3926309567 }, - }, - add_to_queue = { - [72] = { X = 460, Y = 616, Sheet = 3926312257 }, - [36] = { X = 964, Y = 364, Sheet = 3926307971 }, - [96] = { X = 804, Y = 504, Sheet = 3926328650 }, - [48] = { X = 4, Y = 368, Sheet = 3926311105 }, - }, - disc_full = { - [72] = { X = 764, Y = 916, Sheet = 3926316119 }, - [36] = { X = 884, Y = 484, Sheet = 3926305904 }, - [96] = { X = 904, Y = 204, Sheet = 3926321212 }, - [48] = { X = 4, Y = 316, Sheet = 3926309567 }, - }, - transfer_within_a_station = { - [72] = { X = 536, Y = 688, Sheet = 3926316119 }, - [36] = { X = 804, Y = 444, Sheet = 3926305904 }, - [96] = { X = 604, Y = 104, Sheet = 3926321212 }, - [48] = { X = 784, Y = 576, Sheet = 3926311105 }, - }, - laptop_mac = { - [72] = { X = 688, Y = 460, Sheet = 3926316119 }, - [36] = { X = 644, Y = 84, Sheet = 3926305904 }, - [96] = { X = 504, Y = 204, Sheet = 3926333840 }, - [48] = { X = 836, Y = 160, Sheet = 3926309567 }, - }, - book = { - [72] = { X = 80, Y = 612, Sheet = 3926314806 }, - [36] = { X = 244, Y = 364, Sheet = 3926307971 }, - [96] = { X = 704, Y = 904, Sheet = 3926329330 }, - [48] = { X = 316, Y = 628, Sheet = 3926311105 }, - }, - add_box = { - [72] = { X = 840, Y = 312, Sheet = 3926312257 }, - [36] = { X = 804, Y = 44, Sheet = 3926307971 }, - [96] = { X = 204, Y = 504, Sheet = 3926328650 }, - [48] = { X = 836, Y = 212, Sheet = 3926311105 }, - }, - layers = { - [72] = { X = 4, Y = 764, Sheet = 3926316119 }, - [36] = { X = 764, Y = 84, Sheet = 3926305904 }, - [96] = { X = 404, Y = 204, Sheet = 3926333840 }, - [48] = { X = 108, Y = 108, Sheet = 3926309567 }, - }, - format_color_text = { - [72] = { X = 536, Y = 612, Sheet = 3926317787 }, - [36] = { X = 404, Y = 244, Sheet = 3926305904 }, - [96] = { X = 304, Y = 304, Sheet = 3926326846 }, - [48] = { X = 420, Y = 56, Sheet = 3926312257 }, - }, - snooze = { - [72] = { X = 764, Y = 692, Sheet = 3926312257 }, - [36] = { X = 684, Y = 244, Sheet = 3926307971 }, - [96] = { X = 404, Y = 704, Sheet = 3926321212 }, - [48] = { X = 368, Y = 784, Sheet = 3926309567 }, - }, - android = { - [72] = { X = 916, Y = 916, Sheet = 3926313458 }, - [36] = { X = 724, Y = 444, Sheet = 3926307971 }, - [96] = { X = 104, Y = 504, Sheet = 3926328650 }, - [48] = { X = 420, Y = 420, Sheet = 3926311105 }, - }, - ["repeat"] = { - [72] = { X = 156, Y = 80, Sheet = 3926313458 }, - [36] = { X = 244, Y = 324, Sheet = 3926307971 }, - [96] = { X = 804, Y = 704, Sheet = 3926333840 }, - [48] = { X = 160, Y = 4, Sheet = 3926309567 }, - }, - format_strikethrough = { - [72] = { X = 384, Y = 308, Sheet = 3926316119 }, - [36] = { X = 324, Y = 204, Sheet = 3926305904 }, - [96] = { X = 4, Y = 704, Sheet = 3926327588 }, - [48] = { X = 888, Y = 940, Sheet = 3926307971 }, - }, - backspace = { - [72] = { X = 384, Y = 764, Sheet = 3926313458 }, - [36] = { X = 84, Y = 84, Sheet = 3926307971 }, - [96] = { X = 204, Y = 704, Sheet = 3926328650 }, - [48] = { X = 576, Y = 940, Sheet = 3926311105 }, - }, - local_movies = { - [48] = { X = 576, Y = 420, Sheet = 3926309567 }, - [36] = { X = 604, Y = 524, Sheet = 3926305904 }, - [72] = { X = 460, Y = 80, Sheet = 3926319099 }, - [96] = { X = 304, Y = 304, Sheet = 3926334787 }, - }, - track_changes = { - [72] = { X = 536, Y = 536, Sheet = 3926317787 }, - [36] = { X = 604, Y = 124, Sheet = 3926305904 }, - [96] = { X = 4, Y = 604, Sheet = 3926321212 }, - [48] = { X = 420, Y = 472, Sheet = 3926311105 }, - }, - pool = { - [72] = { X = 156, Y = 764, Sheet = 3926314806 }, - [36] = { X = 524, Y = 364, Sheet = 3926305904 }, - [96] = { X = 904, Y = 204, Sheet = 3926329330 }, - [48] = { X = 212, Y = 56, Sheet = 3926309567 }, - }, - thumb_down = { - [72] = { X = 612, Y = 308, Sheet = 3926316119 }, - [36] = { X = 204, Y = 44, Sheet = 3926305904 }, - [96] = { X = 304, Y = 604, Sheet = 3926319860 }, - [48] = { X = 940, Y = 628, Sheet = 3926307971 }, - }, - healing = { - [72] = { X = 156, Y = 840, Sheet = 3926317787 }, - [36] = { X = 724, Y = 804, Sheet = 3926305904 }, - [96] = { X = 904, Y = 904, Sheet = 3926334787 }, - [48] = { X = 704, Y = 524, Sheet = 3926307971 }, - }, - opacity = { - [72] = { X = 80, Y = 844, Sheet = 3926312257 }, - [36] = { X = 884, Y = 564, Sheet = 3926305904 }, - [96] = { X = 104, Y = 704, Sheet = 3926330123 }, - [48] = { X = 784, Y = 888, Sheet = 3926309567 }, - }, - airplay = { - [72] = { X = 308, Y = 156, Sheet = 3926314806 }, - [36] = { X = 4, Y = 364, Sheet = 3926307971 }, - [96] = { X = 604, Y = 104, Sheet = 3926328650 }, - [48] = { X = 472, Y = 368, Sheet = 3926311105 }, - }, - devices = { - [48] = { X = 212, Y = 628, Sheet = 3926311105 }, - [36] = { X = 444, Y = 564, Sheet = 3926305904 }, - [72] = { X = 384, Y = 688, Sheet = 3926319099 }, - [96] = { X = 704, Y = 104, Sheet = 3926326846 }, - }, - battery_charging_80 = { - [72] = { X = 460, Y = 460, Sheet = 3926313458 }, - [36] = { X = 964, Y = 324, Sheet = 3926307971 }, - [96] = { X = 404, Y = 304, Sheet = 3926327588 }, - [48] = { X = 316, Y = 316, Sheet = 3926309567 }, - }, - perm_identity = { - [72] = { X = 156, Y = 536, Sheet = 3926313458 }, - [36] = { X = 684, Y = 4, Sheet = 3926307971 }, - [96] = { X = 804, Y = 904, Sheet = 3926330123 }, - [48] = { X = 264, Y = 888, Sheet = 3926309567 }, - }, - format_textdirection_l_to_r = { - [72] = { X = 764, Y = 232, Sheet = 3926316119 }, - [36] = { X = 564, Y = 204, Sheet = 3926305904 }, - [96] = { X = 104, Y = 704, Sheet = 3926327588 }, - [48] = { X = 316, Y = 784, Sheet = 3926307971 }, - }, - autorenew = { - [72] = { X = 840, Y = 308, Sheet = 3926313458 }, - [36] = { X = 564, Y = 444, Sheet = 3926307971 }, - [96] = { X = 904, Y = 204, Sheet = 3926327588 }, - [48] = { X = 836, Y = 888, Sheet = 3926311105 }, - }, - perm_data_setting = { - [72] = { X = 612, Y = 236, Sheet = 3926312257 }, - [36] = { X = 4, Y = 244, Sheet = 3926307971 }, - [96] = { X = 704, Y = 904, Sheet = 3926330123 }, - [48] = { X = 420, Y = 940, Sheet = 3926309567 }, - }, - contact_mail = { - [72] = { X = 688, Y = 308, Sheet = 3926317787 }, - [36] = { X = 284, Y = 804, Sheet = 3926305904 }, - [96] = { X = 604, Y = 804, Sheet = 3926326846 }, - [48] = { X = 888, Y = 56, Sheet = 3926311105 }, - }, - volume_mute = { - [72] = { X = 80, Y = 916, Sheet = 3926313458 }, - [36] = { X = 724, Y = 124, Sheet = 3926307971 }, - [96] = { X = 304, Y = 804, Sheet = 3926319860 }, - [48] = { X = 316, Y = 108, Sheet = 3926311105 }, - }, - arrow_drop_up = { - [72] = { X = 688, Y = 4, Sheet = 3926313458 }, - [36] = { X = 164, Y = 484, Sheet = 3926307971 }, - [96] = { X = 704, Y = 304, Sheet = 3926327588 }, - [48] = { X = 368, Y = 160, Sheet = 3926312257 }, - }, - filter_7 = { - [72] = { X = 764, Y = 688, Sheet = 3926317787 }, - [36] = { X = 684, Y = 164, Sheet = 3926305904 }, - [96] = { X = 904, Y = 104, Sheet = 3926327588 }, - [48] = { X = 784, Y = 264, Sheet = 3926311105 }, - }, - change_history = { - [48] = { X = 472, Y = 784, Sheet = 3926311105 }, - [36] = { X = 804, Y = 564, Sheet = 3926305904 }, - [72] = { X = 916, Y = 80, Sheet = 3926319099 }, - [96] = { X = 504, Y = 4, Sheet = 3926328650 }, - }, - folder_shared = { - [72] = { X = 232, Y = 4, Sheet = 3926316119 }, - [36] = { X = 504, Y = 4, Sheet = 3926305904 }, - [96] = { X = 504, Y = 404, Sheet = 3926326846 }, - [48] = { X = 264, Y = 316, Sheet = 3926311105 }, - }, - casino = { - [72] = { X = 612, Y = 844, Sheet = 3926312257 }, - [36] = { X = 524, Y = 964, Sheet = 3926305904 }, - [96] = { X = 4, Y = 4, Sheet = 3926328650 }, - [48] = { X = 264, Y = 836, Sheet = 3926311105 }, - }, - highlight_off = { - [72] = { X = 156, Y = 536, Sheet = 3926317787 }, - [36] = { X = 164, Y = 164, Sheet = 3926305904 }, - [96] = { X = 504, Y = 704, Sheet = 3926334787 }, - [48] = { X = 836, Y = 576, Sheet = 3926307971 }, - }, - arrow_drop_down = { - [72] = { X = 916, Y = 232, Sheet = 3926313458 }, - [36] = { X = 324, Y = 524, Sheet = 3926307971 }, - [96] = { X = 404, Y = 404, Sheet = 3926327588 }, - [48] = { X = 264, Y = 56, Sheet = 3926312257 }, - }, - hdr_on = { - [72] = { X = 916, Y = 916, Sheet = 3926317787 }, - [36] = { X = 684, Y = 484, Sheet = 3926305904 }, - [96] = { X = 604, Y = 604, Sheet = 3926334787 }, - [48] = { X = 264, Y = 628, Sheet = 3926307971 }, - }, - view_stream = { - [72] = { X = 916, Y = 464, Sheet = 3926312257 }, - [36] = { X = 164, Y = 244, Sheet = 3926307971 }, - [96] = { X = 904, Y = 904, Sheet = 3926321212 }, - [48] = { X = 628, Y = 732, Sheet = 3926311105 }, - }, - games = { - [72] = { X = 232, Y = 80, Sheet = 3926316119 }, - [36] = { X = 424, Y = 4, Sheet = 3926305904 }, - [96] = { X = 304, Y = 604, Sheet = 3926334787 }, - [48] = { X = 212, Y = 888, Sheet = 3926307971 }, - }, - volume_down = { - [72] = { X = 764, Y = 916, Sheet = 3926314806 }, - [36] = { X = 444, Y = 164, Sheet = 3926307971 }, - [96] = { X = 4, Y = 104, Sheet = 3926319860 }, - [48] = { X = 56, Y = 56, Sheet = 3926311105 }, - }, - assignment_ind = { - [72] = { X = 916, Y = 308, Sheet = 3926313458 }, - [36] = { X = 844, Y = 484, Sheet = 3926307971 }, - [96] = { X = 504, Y = 404, Sheet = 3926327588 }, - [48] = { X = 472, Y = 576, Sheet = 3926311105 }, - }, - arrow_upward = { - [72] = { X = 80, Y = 384, Sheet = 3926313458 }, - [36] = { X = 164, Y = 524, Sheet = 3926307971 }, - [96] = { X = 304, Y = 404, Sheet = 3926327588 }, - [48] = { X = 316, Y = 160, Sheet = 3926312257 }, - }, - crop_landscape = { - [72] = { X = 384, Y = 80, Sheet = 3926317787 }, - [36] = { X = 524, Y = 724, Sheet = 3926305904 }, - [96] = { X = 304, Y = 4, Sheet = 3926326846 }, - [48] = { X = 160, Y = 212, Sheet = 3926311105 }, - }, - markunread_mailbox = { - [72] = { X = 612, Y = 80, Sheet = 3926317787 }, - [36] = { X = 644, Y = 684, Sheet = 3926305904 }, - [96] = { X = 404, Y = 4, Sheet = 3926334787 }, - [48] = { X = 680, Y = 524, Sheet = 3926309567 }, - }, - grid_on = { - [72] = { X = 460, Y = 916, Sheet = 3926317787 }, - [36] = { X = 924, Y = 804, Sheet = 3926305904 }, - [96] = { X = 404, Y = 304, Sheet = 3926333840 }, - [48] = { X = 316, Y = 628, Sheet = 3926307971 }, - }, - directions = { - [48] = { X = 784, Y = 316, Sheet = 3926309567 }, - [36] = { X = 924, Y = 484, Sheet = 3926305904 }, - [72] = { X = 156, Y = 156, Sheet = 3926319099 }, - [96] = { X = 404, Y = 304, Sheet = 3926321212 }, - }, - forum = { - [72] = { X = 688, Y = 232, Sheet = 3926316119 }, - [36] = { X = 404, Y = 204, Sheet = 3926305904 }, - [96] = { X = 104, Y = 304, Sheet = 3926326846 }, - [48] = { X = 368, Y = 940, Sheet = 3926307971 }, - }, - arrow_forward = { - [72] = { X = 536, Y = 384, Sheet = 3926313458 }, - [36] = { X = 564, Y = 284, Sheet = 3926307971 }, - [96] = { X = 804, Y = 404, Sheet = 3926327588 }, - [48] = { X = 628, Y = 4, Sheet = 3926312257 }, - }, - assignment_return = { - [72] = { X = 80, Y = 4, Sheet = 3926313458 }, - [36] = { X = 284, Y = 524, Sheet = 3926307971 }, - [96] = { X = 904, Y = 304, Sheet = 3926327588 }, - [48] = { X = 732, Y = 524, Sheet = 3926311105 }, - }, - volume_up = { - [72] = { X = 688, Y = 156, Sheet = 3926314806 }, - [36] = { X = 684, Y = 324, Sheet = 3926307971 }, - [96] = { X = 204, Y = 604, Sheet = 3926321212 }, - [48] = { X = 160, Y = 732, Sheet = 3926311105 }, - }, - launch = { - [72] = { X = 688, Y = 764, Sheet = 3926316119 }, - [36] = { X = 284, Y = 84, Sheet = 3926305904 }, - [96] = { X = 804, Y = 404, Sheet = 3926333840 }, - [48] = { X = 108, Y = 56, Sheet = 3926309567 }, - }, - lens = { - [72] = { X = 80, Y = 232, Sheet = 3926316119 }, - [36] = { X = 124, Y = 124, Sheet = 3926305904 }, - [96] = { X = 4, Y = 104, Sheet = 3926333840 }, - [48] = { X = 56, Y = 4, Sheet = 3926309567 }, - }, - attach_file = { - [72] = { X = 232, Y = 308, Sheet = 3926313458 }, - [36] = { X = 324, Y = 484, Sheet = 3926307971 }, - [96] = { X = 4, Y = 404, Sheet = 3926327588 }, - [48] = { X = 680, Y = 472, Sheet = 3926311105 }, - }, - attach_money = { - [72] = { X = 764, Y = 232, Sheet = 3926313458 }, - [36] = { X = 964, Y = 484, Sheet = 3926307971 }, - [96] = { X = 104, Y = 404, Sheet = 3926327588 }, - [48] = { X = 4, Y = 524, Sheet = 3926311105 }, - }, - audiotrack = { - [72] = { X = 4, Y = 460, Sheet = 3926313458 }, - [36] = { X = 324, Y = 444, Sheet = 3926307971 }, - [96] = { X = 604, Y = 4, Sheet = 3926327588 }, - [48] = { X = 160, Y = 576, Sheet = 3926311105 }, - }, - iso = { - [72] = { X = 460, Y = 688, Sheet = 3926316119 }, - [36] = { X = 284, Y = 284, Sheet = 3926305904 }, - [96] = { X = 104, Y = 204, Sheet = 3926333840 }, - [48] = { X = 264, Y = 784, Sheet = 3926307971 }, - }, - crop_original = { - [72] = { X = 232, Y = 460, Sheet = 3926317787 }, - [36] = { X = 764, Y = 644, Sheet = 3926305904 }, - [96] = { X = 404, Y = 4, Sheet = 3926326846 }, - [48] = { X = 680, Y = 160, Sheet = 3926311105 }, - }, - music_video = { - [48] = { X = 160, Y = 524, Sheet = 3926309567 }, - [36] = { X = 484, Y = 804, Sheet = 3926305904 }, - [72] = { X = 764, Y = 688, Sheet = 3926319099 }, - [96] = { X = 904, Y = 304, Sheet = 3926334787 }, - }, - strikethrough_s = { - [48] = { X = 264, Y = 56, Sheet = 3926309567 }, - [36] = { X = 4, Y = 644, Sheet = 3926305904 }, - [72] = { X = 232, Y = 384, Sheet = 3926319099 }, - [96] = { X = 504, Y = 104, Sheet = 3926319860 }, - }, - assignment = { - [72] = { X = 384, Y = 232, Sheet = 3926313458 }, - [36] = { X = 164, Y = 324, Sheet = 3926307971 }, - [96] = { X = 704, Y = 4, Sheet = 3926327588 }, - [48] = { X = 628, Y = 472, Sheet = 3926311105 }, - }, - assignment_returned = { - [72] = { X = 460, Y = 4, Sheet = 3926313458 }, - [36] = { X = 764, Y = 284, Sheet = 3926307971 }, - [96] = { X = 904, Y = 4, Sheet = 3926327588 }, - [48] = { X = 836, Y = 524, Sheet = 3926311105 }, - }, - keyboard_arrow_right = { - [72] = { X = 384, Y = 308, Sheet = 3926314806 }, - [36] = { X = 964, Y = 284, Sheet = 3926305904 }, - [96] = { X = 104, Y = 504, Sheet = 3926333840 }, - [48] = { X = 732, Y = 784, Sheet = 3926307971 }, - }, -} diff --git a/src/IconLabel/Spritesheet/Sheet8.lua b/src/IconLabel/Spritesheet/Sheet8.lua deleted file mode 100644 index 203fa582..00000000 --- a/src/IconLabel/Spritesheet/Sheet8.lua +++ /dev/null @@ -1,507 +0,0 @@ -return { - assignment_turned_in = { - [72] = { X = 308, Y = 80, Sheet = 3926313458 }, - [36] = { X = 644, Y = 284, Sheet = 3926307971 }, - [96] = { X = 4, Y = 104, Sheet = 3926327588 }, - [48] = { X = 784, Y = 524, Sheet = 3926311105 }, - }, - favorite_border = { - [72] = { X = 156, Y = 612, Sheet = 3926316119 }, - [36] = { X = 764, Y = 284, Sheet = 3926305904 }, - [96] = { X = 804, Y = 704, Sheet = 3926327588 }, - [48] = { X = 628, Y = 576, Sheet = 3926311105 }, - }, - devices_other = { - [48] = { X = 108, Y = 628, Sheet = 3926311105 }, - [36] = { X = 524, Y = 604, Sheet = 3926305904 }, - [72] = { X = 688, Y = 4, Sheet = 3926319099 }, - [96] = { X = 204, Y = 204, Sheet = 3926326846 }, - }, - smartphone = { - [72] = { X = 308, Y = 920, Sheet = 3926312257 }, - [36] = { X = 644, Y = 164, Sheet = 3926307971 }, - [96] = { X = 304, Y = 204, Sheet = 3926321212 }, - [48] = { X = 316, Y = 524, Sheet = 3926309567 }, - }, - web_asset = { - [72] = { X = 460, Y = 384, Sheet = 3926313458 }, - [36] = { X = 4, Y = 484, Sheet = 3926307971 }, - [96] = { X = 804, Y = 4, Sheet = 3926321212 }, - [48] = { X = 940, Y = 108, Sheet = 3926312257 }, - }, - business_center = { - [72] = { X = 764, Y = 536, Sheet = 3926313458 }, - [36] = { X = 244, Y = 204, Sheet = 3926307971 }, - [96] = { X = 904, Y = 704, Sheet = 3926329330 }, - [48] = { X = 940, Y = 56, Sheet = 3926311105 }, - }, - format_paint = { - [72] = { X = 536, Y = 232, Sheet = 3926316119 }, - [36] = { X = 364, Y = 204, Sheet = 3926305904 }, - [96] = { X = 504, Y = 504, Sheet = 3926327588 }, - [48] = { X = 472, Y = 160, Sheet = 3926312257 }, - }, - timeline = { - [72] = { X = 840, Y = 308, Sheet = 3926316119 }, - [36] = { X = 364, Y = 44, Sheet = 3926305904 }, - [96] = { X = 304, Y = 504, Sheet = 3926319860 }, - [48] = { X = 4, Y = 4, Sheet = 3926312257 }, - }, - message = { - [48] = { X = 316, Y = 576, Sheet = 3926309567 }, - [36] = { X = 204, Y = 644, Sheet = 3926305904 }, - [72] = { X = 764, Y = 384, Sheet = 3926319099 }, - [96] = { X = 604, Y = 804, Sheet = 3926334787 }, - }, - spa = { - [72] = { X = 384, Y = 464, Sheet = 3926312257 }, - [36] = { X = 924, Y = 44, Sheet = 3926307971 }, - [96] = { X = 104, Y = 504, Sheet = 3926319860 }, - [48] = { X = 784, Y = 836, Sheet = 3926309567 }, - }, - title = { - [72] = { X = 232, Y = 384, Sheet = 3926316119 }, - [36] = { X = 244, Y = 44, Sheet = 3926305904 }, - [96] = { X = 4, Y = 904, Sheet = 3926319860 }, - [48] = { X = 212, Y = 264, Sheet = 3926311105 }, - }, - create_new_folder = { - [72] = { X = 460, Y = 4, Sheet = 3926317787 }, - [36] = { X = 444, Y = 644, Sheet = 3926305904 }, - [96] = { X = 104, Y = 904, Sheet = 3926326846 }, - [48] = { X = 628, Y = 56, Sheet = 3926311105 }, - }, - check = { - [36] = { X = 204, Y = 924, Sheet = 3926305904 }, - [24] = { X = 312, Y = 4, Size = 24, Sheet = 3926305904 }, - [96] = { X = 504, Y = 604, Sheet = 3926329330 }, - [72] = { X = 4, Y = 688, Sheet = 3926319099 }, - [48] = { X = 316, Y = 836, Sheet = 3926311105 }, - }, - signal_cellular_null = { - [72] = { X = 384, Y = 80, Sheet = 3926313458 }, - [36] = { X = 804, Y = 484, Sheet = 3926307971 }, - [96] = { X = 904, Y = 4, Sheet = 3926321212 }, - [48] = { X = 108, Y = 940, Sheet = 3926307971 }, - }, - tab = { - [72] = { X = 916, Y = 536, Sheet = 3926317787 }, - [36] = { X = 484, Y = 484, Sheet = 3926305904 }, - [96] = { X = 804, Y = 504, Sheet = 3926321212 }, - [48] = { X = 680, Y = 680, Sheet = 3926307971 }, - }, - wb_iridescent = { - [72] = { X = 764, Y = 4, Sheet = 3926313458 }, - [36] = { X = 844, Y = 284, Sheet = 3926307971 }, - [96] = { X = 204, Y = 104, Sheet = 3926321212 }, - [48] = { X = 680, Y = 524, Sheet = 3926311105 }, - }, - sms_failed = { - [72] = { X = 764, Y = 768, Sheet = 3926312257 }, - [36] = { X = 444, Y = 4, Sheet = 3926307971 }, - [96] = { X = 4, Y = 204, Sheet = 3926321212 }, - [48] = { X = 836, Y = 576, Sheet = 3926309567 }, - }, - signal_wifi_0_bar = { - [72] = { X = 232, Y = 80, Sheet = 3926313458 }, - [36] = { X = 924, Y = 484, Sheet = 3926307971 }, - [96] = { X = 904, Y = 104, Sheet = 3926321212 }, - [48] = { X = 4, Y = 212, Sheet = 3926309567 }, - }, - airline_seat_recline_extra = { - [72] = { X = 840, Y = 156, Sheet = 3926314806 }, - [36] = { X = 324, Y = 364, Sheet = 3926305904 }, - [96] = { X = 4, Y = 204, Sheet = 3926328650 }, - [48] = { X = 212, Y = 108, Sheet = 3926312257 }, - }, - center_focus_strong = { - [72] = { X = 840, Y = 768, Sheet = 3926312257 }, - [36] = { X = 764, Y = 564, Sheet = 3926305904 }, - [96] = { X = 804, Y = 4, Sheet = 3926328650 }, - [48] = { X = 732, Y = 784, Sheet = 3926311105 }, - }, - signal_cellular_no_sim = { - [72] = { X = 688, Y = 232, Sheet = 3926313458 }, - [36] = { X = 404, Y = 484, Sheet = 3926307971 }, - [96] = { X = 804, Y = 104, Sheet = 3926321212 }, - [48] = { X = 784, Y = 732, Sheet = 3926307971 }, - }, - format_indent_increase = { - [72] = { X = 764, Y = 308, Sheet = 3926316119 }, - [36] = { X = 524, Y = 204, Sheet = 3926305904 }, - [96] = { X = 104, Y = 604, Sheet = 3926327588 }, - [48] = { X = 472, Y = 4, Sheet = 3926312257 }, - }, - directions_walk = { - [48] = { X = 940, Y = 316, Sheet = 3926309567 }, - [36] = { X = 84, Y = 564, Sheet = 3926305904 }, - [72] = { X = 460, Y = 156, Sheet = 3926319099 }, - [96] = { X = 304, Y = 304, Sheet = 3926321212 }, - }, - local_play = { - [48] = { X = 472, Y = 264, Sheet = 3926309567 }, - [36] = { X = 164, Y = 604, Sheet = 3926305904 }, - [72] = { X = 612, Y = 612, Sheet = 3926319099 }, - [96] = { X = 304, Y = 104, Sheet = 3926335698 }, - }, - person_outline = { - [72] = { X = 232, Y = 612, Sheet = 3926313458 }, - [36] = { X = 244, Y = 4, Sheet = 3926307971 }, - [96] = { X = 904, Y = 704, Sheet = 3926330123 }, - [48] = { X = 264, Y = 836, Sheet = 3926309567 }, - }, - polymer = { - [72] = { X = 460, Y = 764, Sheet = 3926314806 }, - [36] = { X = 204, Y = 364, Sheet = 3926305904 }, - [96] = { X = 604, Y = 304, Sheet = 3926329330 }, - [48] = { X = 316, Y = 56, Sheet = 3926309567 }, - }, - fiber_smart_record = { - [72] = { X = 308, Y = 612, Sheet = 3926316119 }, - [36] = { X = 484, Y = 444, Sheet = 3926305904 }, - [96] = { X = 304, Y = 904, Sheet = 3926327588 }, - [48] = { X = 524, Y = 4, Sheet = 3926312257 }, - }, - vertical_align_center = { - [72] = { X = 384, Y = 384, Sheet = 3926317787 }, - [36] = { X = 924, Y = 604, Sheet = 3926305904 }, - [96] = { X = 304, Y = 604, Sheet = 3926321212 }, - [48] = { X = 628, Y = 4, Sheet = 3926311105 }, - }, - voice_chat = { - [72] = { X = 4, Y = 920, Sheet = 3926312257 }, - [36] = { X = 884, Y = 44, Sheet = 3926307971 }, - [96] = { X = 404, Y = 804, Sheet = 3926321212 }, - [48] = { X = 524, Y = 4, Sheet = 3926311105 }, - }, - local_florist = { - [72] = { X = 916, Y = 916, Sheet = 3926316119 }, - [36] = { X = 964, Y = 484, Sheet = 3926305904 }, - [96] = { X = 404, Y = 304, Sheet = 3926334787 }, - [48] = { X = 472, Y = 420, Sheet = 3926309567 }, - }, - eject = { - [72] = { X = 460, Y = 156, Sheet = 3926316119 }, - [36] = { X = 884, Y = 364, Sheet = 3926305904 }, - [96] = { X = 4, Y = 604, Sheet = 3926326846 }, - [48] = { X = 576, Y = 888, Sheet = 3926311105 }, - }, - gps_not_fixed = { - [72] = { X = 916, Y = 308, Sheet = 3926316119 }, - [36] = { X = 484, Y = 44, Sheet = 3926305904 }, - [96] = { X = 204, Y = 504, Sheet = 3926334787 }, - [48] = { X = 576, Y = 576, Sheet = 3926307971 }, - }, - navigation = { - [72] = { X = 764, Y = 156, Sheet = 3926317787 }, - [36] = { X = 524, Y = 764, Sheet = 3926305904 }, - [96] = { X = 404, Y = 204, Sheet = 3926334787 }, - [48] = { X = 420, Y = 732, Sheet = 3926309567 }, - }, - tablet_mac = { - [72] = { X = 232, Y = 688, Sheet = 3926317787 }, - [36] = { X = 844, Y = 164, Sheet = 3926305904 }, - [96] = { X = 4, Y = 904, Sheet = 3926321212 }, - [48] = { X = 108, Y = 680, Sheet = 3926307971 }, - }, - signal_cellular_off = { - [72] = { X = 308, Y = 612, Sheet = 3926314806 }, - [36] = { X = 4, Y = 524, Sheet = 3926307971 }, - [96] = { X = 104, Y = 804, Sheet = 3926321212 }, - [48] = { X = 56, Y = 56, Sheet = 3926309567 }, - }, - link = { - [72] = { X = 308, Y = 764, Sheet = 3926316119 }, - [36] = { X = 164, Y = 404, Sheet = 3926305904 }, - [96] = { X = 104, Y = 404, Sheet = 3926321212 }, - [48] = { X = 888, Y = 784, Sheet = 3926309567 }, - }, - sort = { - [72] = { X = 612, Y = 536, Sheet = 3926313458 }, - [36] = { X = 404, Y = 44, Sheet = 3926307971 }, - [96] = { X = 804, Y = 704, Sheet = 3926321212 }, - [48] = { X = 888, Y = 836, Sheet = 3926309567 }, - }, - drafts = { - [72] = { X = 764, Y = 840, Sheet = 3926316119 }, - [36] = { X = 364, Y = 404, Sheet = 3926305904 }, - [96] = { X = 404, Y = 604, Sheet = 3926326846 }, - [48] = { X = 368, Y = 316, Sheet = 3926309567 }, - }, - location_disabled = { - [48] = { X = 888, Y = 368, Sheet = 3926309567 }, - [36] = { X = 244, Y = 524, Sheet = 3926305904 }, - [72] = { X = 80, Y = 308, Sheet = 3926319099 }, - [96] = { X = 404, Y = 104, Sheet = 3926335698 }, - }, - usb = { - [48] = { X = 56, Y = 628, Sheet = 3926311105 }, - [36] = { X = 964, Y = 564, Sheet = 3926305904 }, - [72] = { X = 916, Y = 612, Sheet = 3926319099 }, - [96] = { X = 904, Y = 104, Sheet = 3926319860 }, - }, - view_carousel = { - [72] = { X = 764, Y = 384, Sheet = 3926317787 }, - [36] = { X = 84, Y = 764, Sheet = 3926305904 }, - [96] = { X = 764, Y = 764, Sheet = 3926319099 }, - [48] = { X = 264, Y = 160, Sheet = 3926311105 }, - }, - art_track = { - [72] = { X = 232, Y = 232, Sheet = 3926313458 }, - [36] = { X = 84, Y = 484, Sheet = 3926307971 }, - [96] = { X = 604, Y = 304, Sheet = 3926327588 }, - [48] = { X = 628, Y = 56, Sheet = 3926312257 }, - }, - live_help = { - [72] = { X = 80, Y = 916, Sheet = 3926316119 }, - [36] = { X = 884, Y = 404, Sheet = 3926305904 }, - [96] = { X = 4, Y = 404, Sheet = 3926335698 }, - [48] = { X = 4, Y = 160, Sheet = 3926309567 }, - }, - chat_bubble = { - [48] = { X = 836, Y = 784, Sheet = 3926311105 }, - [36] = { X = 604, Y = 564, Sheet = 3926305904 }, - [72] = { X = 4, Y = 80, Sheet = 3926319099 }, - [96] = { X = 804, Y = 304, Sheet = 3926328650 }, - }, - undo = { - [72] = { X = 232, Y = 916, Sheet = 3926316119 }, - [36] = { X = 124, Y = 564, Sheet = 3926305904 }, - [96] = { X = 204, Y = 4, Sheet = 3926321212 }, - [48] = { X = 732, Y = 316, Sheet = 3926309567 }, - }, - mouse = { - [72] = { X = 80, Y = 308, Sheet = 3926317787 }, - [36] = { X = 204, Y = 964, Sheet = 3926305904 }, - [96] = { X = 804, Y = 404, Sheet = 3926334787 }, - [48] = { X = 56, Y = 680, Sheet = 3926309567 }, - }, - widgets = { - [72] = { X = 80, Y = 840, Sheet = 3926314806 }, - [36] = { X = 644, Y = 404, Sheet = 3926307971 }, - [96] = { X = 904, Y = 704, Sheet = 3926321212 }, - [48] = { X = 160, Y = 368, Sheet = 3926311105 }, - }, - kitchen = { - [72] = { X = 308, Y = 232, Sheet = 3926314806 }, - [36] = { X = 644, Y = 284, Sheet = 3926305904 }, - [96] = { X = 304, Y = 404, Sheet = 3926333840 }, - [48] = { X = 628, Y = 4, Sheet = 3926309567 }, - }, - signal_cellular_connected_no_internet_0_bar = { - [72] = { X = 764, Y = 460, Sheet = 3926314806 }, - [36] = { X = 284, Y = 284, Sheet = 3926307971 }, - [96] = { X = 704, Y = 904, Sheet = 3926321212 }, - [48] = { X = 576, Y = 888, Sheet = 3926307971 }, - }, - switch_video = { - [72] = { X = 916, Y = 232, Sheet = 3926314806 }, - [36] = { X = 44, Y = 84, Sheet = 3926305904 }, - [96] = { X = 904, Y = 4, Sheet = 3926319860 }, - [48] = { X = 940, Y = 4, Sheet = 3926309567 }, - }, - device_hub = { - [48] = { X = 160, Y = 628, Sheet = 3926311105 }, - [36] = { X = 604, Y = 604, Sheet = 3926305904 }, - [72] = { X = 688, Y = 612, Sheet = 3926319099 }, - [96] = { X = 304, Y = 204, Sheet = 3926326846 }, - }, - tv = { - [72] = { X = 308, Y = 536, Sheet = 3926316119 }, - [36] = { X = 524, Y = 244, Sheet = 3926305904 }, - [96] = { X = 604, Y = 404, Sheet = 3926319860 }, - [48] = { X = 576, Y = 628, Sheet = 3926311105 }, - }, - high_quality = { - [72] = { X = 156, Y = 916, Sheet = 3926317787 }, - [36] = { X = 884, Y = 124, Sheet = 3926305904 }, - [96] = { X = 704, Y = 704, Sheet = 3926334787 }, - [48] = { X = 56, Y = 888, Sheet = 3926307971 }, - }, - weekend = { - [72] = { X = 308, Y = 916, Sheet = 3926313458 }, - [36] = { X = 284, Y = 324, Sheet = 3926307971 }, - [96] = { X = 204, Y = 904, Sheet = 3926321212 }, - [48] = { X = 940, Y = 4, Sheet = 3926312257 }, - }, - sort_by_alpha = { - [72] = { X = 4, Y = 688, Sheet = 3926313458 }, - [36] = { X = 284, Y = 4, Sheet = 3926307971 }, - [96] = { X = 704, Y = 504, Sheet = 3926321212 }, - [48] = { X = 524, Y = 836, Sheet = 3926309567 }, - }, - vignette = { - [72] = { X = 612, Y = 688, Sheet = 3926313458 }, - [36] = { X = 204, Y = 204, Sheet = 3926307971 }, - [96] = { X = 104, Y = 604, Sheet = 3926321212 }, - [48] = { X = 732, Y = 56, Sheet = 3926311105 }, - }, - pets = { - [72] = { X = 308, Y = 692, Sheet = 3926312257 }, - [36] = { X = 844, Y = 4, Sheet = 3926307971 }, - [96] = { X = 804, Y = 4, Sheet = 3926329330 }, - [48] = { X = 316, Y = 836, Sheet = 3926309567 }, - }, - assessment = { - [72] = { X = 80, Y = 80, Sheet = 3926313458 }, - [36] = { X = 724, Y = 484, Sheet = 3926307971 }, - [96] = { X = 804, Y = 304, Sheet = 3926327588 }, - [48] = { X = 524, Y = 576, Sheet = 3926311105 }, - }, - view_day = { - [72] = { X = 232, Y = 920, Sheet = 3926312257 }, - [36] = { X = 724, Y = 564, Sheet = 3926305904 }, - [96] = { X = 404, Y = 904, Sheet = 3926319860 }, - [48] = { X = 628, Y = 784, Sheet = 3926311105 }, - }, - call_missed = { - [72] = { X = 80, Y = 236, Sheet = 3926312257 }, - [36] = { X = 564, Y = 244, Sheet = 3926307971 }, - [96] = { X = 104, Y = 404, Sheet = 3926328650 }, - [48] = { X = 264, Y = 784, Sheet = 3926311105 }, - }, - sim_card = { - [72] = { X = 4, Y = 232, Sheet = 3926314806 }, - [36] = { X = 84, Y = 284, Sheet = 3926307971 }, - [96] = { X = 704, Y = 604, Sheet = 3926321212 }, - [48] = { X = 680, Y = 784, Sheet = 3926309567 }, - }, - vpn_key = { - [72] = { X = 156, Y = 80, Sheet = 3926314806 }, - [36] = { X = 44, Y = 324, Sheet = 3926307971 }, - [96] = { X = 704, Y = 204, Sheet = 3926319860 }, - [48] = { X = 368, Y = 680, Sheet = 3926311105 }, - }, - sim_card_alert = { - [72] = { X = 688, Y = 4, Sheet = 3926314806 }, - [36] = { X = 804, Y = 324, Sheet = 3926307971 }, - [96] = { X = 704, Y = 304, Sheet = 3926319860 }, - [48] = { X = 316, Y = 420, Sheet = 3926309567 }, - }, - flash_auto = { - [72] = { X = 384, Y = 916, Sheet = 3926317787 }, - [36] = { X = 804, Y = 484, Sheet = 3926305904 }, - [96] = { X = 804, Y = 304, Sheet = 3926326846 }, - [48] = { X = 888, Y = 316, Sheet = 3926311105 }, - }, - directions_subway = { - [48] = { X = 264, Y = 680, Sheet = 3926311105 }, - [36] = { X = 884, Y = 684, Sheet = 3926305904 }, - [72] = { X = 384, Y = 80, Sheet = 3926319099 }, - [96] = { X = 104, Y = 304, Sheet = 3926321212 }, - }, - signal_wifi_3_bar_lock = { - [72] = { X = 232, Y = 916, Sheet = 3926313458 }, - [36] = { X = 884, Y = 484, Sheet = 3926307971 }, - [96] = { X = 404, Y = 404, Sheet = 3926319860 }, - [48] = { X = 264, Y = 108, Sheet = 3926309567 }, - }, - signal_cellular_2_bar = { - [72] = { X = 536, Y = 844, Sheet = 3926312257 }, - [36] = { X = 244, Y = 164, Sheet = 3926307971 }, - [96] = { X = 304, Y = 904, Sheet = 3926319860 }, - [48] = { X = 368, Y = 628, Sheet = 3926307971 }, - }, - fast_forward = { - [72] = { X = 156, Y = 688, Sheet = 3926316119 }, - [36] = { X = 884, Y = 284, Sheet = 3926305904 }, - [96] = { X = 4, Y = 804, Sheet = 3926327588 }, - [48] = { X = 264, Y = 576, Sheet = 3926311105 }, - }, - signal_wifi_2_bar = { - [72] = { X = 536, Y = 764, Sheet = 3926313458 }, - [36] = { X = 244, Y = 84, Sheet = 3926307971 }, - [96] = { X = 304, Y = 204, Sheet = 3926319860 }, - [48] = { X = 212, Y = 212, Sheet = 3926309567 }, - }, - border_all = { - [72] = { X = 4, Y = 688, Sheet = 3926314806 }, - [36] = { X = 484, Y = 364, Sheet = 3926307971 }, - [96] = { X = 404, Y = 704, Sheet = 3926329330 }, - [48] = { X = 4, Y = 680, Sheet = 3926311105 }, - }, - skip_next = { - [72] = { X = 156, Y = 688, Sheet = 3926314806 }, - [36] = { X = 724, Y = 324, Sheet = 3926307971 }, - [96] = { X = 104, Y = 4, Sheet = 3926319860 }, - [48] = { X = 732, Y = 472, Sheet = 3926309567 }, - }, - signal_wifi_4_bar = { - [72] = { X = 916, Y = 80, Sheet = 3926314806 }, - [36] = { X = 44, Y = 844, Sheet = 3926305904 }, - [96] = { X = 304, Y = 404, Sheet = 3926319860 }, - [48] = { X = 524, Y = 56, Sheet = 3926309567 }, - }, - vertical_align_top = { - [72] = { X = 840, Y = 308, Sheet = 3926317787 }, - [36] = { X = 844, Y = 644, Sheet = 3926305904 }, - [96] = { X = 704, Y = 104, Sheet = 3926321212 }, - [48] = { X = 524, Y = 160, Sheet = 3926311105 }, - }, - memory = { - [72] = { X = 232, Y = 4, Sheet = 3926317787 }, - [36] = { X = 564, Y = 684, Sheet = 3926305904 }, - [96] = { X = 804, Y = 104, Sheet = 3926334787 }, - [48] = { X = 940, Y = 472, Sheet = 3926309567 }, - }, - local_parking = { - [48] = { X = 888, Y = 212, Sheet = 3926309567 }, - [36] = { X = 884, Y = 604, Sheet = 3926305904 }, - [72] = { X = 232, Y = 764, Sheet = 3926319099 }, - [96] = { X = 204, Y = 604, Sheet = 3926335698 }, - }, - speaker = { - [72] = { X = 688, Y = 920, Sheet = 3926312257 }, - [36] = { X = 924, Y = 564, Sheet = 3926305904 }, - [96] = { X = 404, Y = 604, Sheet = 3926321212 }, - [48] = { X = 56, Y = 888, Sheet = 3926309567 }, - }, - timer = { - [72] = { X = 4, Y = 384, Sheet = 3926316119 }, - [36] = { X = 704, Y = 4, Sheet = 3926305904 }, - [96] = { X = 604, Y = 704, Sheet = 3926319860 }, - [48] = { X = 316, Y = 316, Sheet = 3926311105 }, - }, - forward = { - [72] = { X = 916, Y = 612, Sheet = 3926317787 }, - [36] = { X = 884, Y = 204, Sheet = 3926305904 }, - [96] = { X = 904, Y = 604, Sheet = 3926327588 }, - [48] = { X = 212, Y = 836, Sheet = 3926307971 }, - }, - local_pizza = { - [48] = { X = 576, Y = 264, Sheet = 3926309567 }, - [36] = { X = 84, Y = 604, Sheet = 3926305904 }, - [72] = { X = 536, Y = 764, Sheet = 3926319099 }, - [96] = { X = 4, Y = 304, Sheet = 3926335698 }, - }, - slow_motion_video = { - [72] = { X = 4, Y = 612, Sheet = 3926314806 }, - [36] = { X = 284, Y = 204, Sheet = 3926307971 }, - [96] = { X = 104, Y = 104, Sheet = 3926319860 }, - [48] = { X = 888, Y = 680, Sheet = 3926309567 }, - }, - brightness_2 = { - [72] = { X = 612, Y = 920, Sheet = 3926312257 }, - [36] = { X = 684, Y = 84, Sheet = 3926307971 }, - [96] = { X = 104, Y = 504, Sheet = 3926329330 }, - [48] = { X = 56, Y = 212, Sheet = 3926311105 }, - }, - watch = { - [72] = { X = 536, Y = 916, Sheet = 3926313458 }, - [36] = { X = 444, Y = 404, Sheet = 3926307971 }, - [96] = { X = 104, Y = 204, Sheet = 3926319860 }, - [48] = { X = 56, Y = 576, Sheet = 3926311105 }, - }, - import_contacts = { - [72] = { X = 688, Y = 536, Sheet = 3926317787 }, - [36] = { X = 924, Y = 84, Sheet = 3926305904 }, - [96] = { X = 304, Y = 904, Sheet = 3926334787 }, - [48] = { X = 56, Y = 680, Sheet = 3926307971 }, - }, - label = { - [72] = { X = 384, Y = 232, Sheet = 3926314806 }, - [36] = { X = 484, Y = 284, Sheet = 3926305904 }, - [96] = { X = 504, Y = 404, Sheet = 3926333840 }, - [48] = { X = 888, Y = 4, Sheet = 3926309567 }, - }, -} diff --git a/src/IconLabel/Spritesheet/Sheet9.lua b/src/IconLabel/Spritesheet/Sheet9.lua deleted file mode 100644 index 5bc538f7..00000000 --- a/src/IconLabel/Spritesheet/Sheet9.lua +++ /dev/null @@ -1,508 +0,0 @@ -return { - remove_circle = { - [72] = { X = 232, Y = 460, Sheet = 3926313458 }, - [36] = { X = 364, Y = 444, Sheet = 3926307971 }, - [96] = { X = 804, Y = 604, Sheet = 3926333840 }, - [48] = { X = 524, Y = 472, Sheet = 3926309567 }, - }, - file_upload = { - [72] = { X = 612, Y = 80, Sheet = 3926316119 }, - [36] = { X = 404, Y = 444, Sheet = 3926305904 }, - [96] = { X = 804, Y = 804, Sheet = 3926327588 }, - [48] = { X = 316, Y = 4, Sheet = 3926312257 }, - }, - format_align_right = { - [72] = { X = 156, Y = 308, Sheet = 3926316119 }, - [36] = { X = 404, Y = 44, Sheet = 3926305904 }, - [96] = { X = 404, Y = 404, Sheet = 3926326846 }, - [48] = { X = 628, Y = 264, Sheet = 3926311105 }, - }, - local_activity = { - [36] = { X = 644, Y = 244, Sheet = 3926305904 }, - [24] = { X = 32, Y = 4, Size = 24, Sheet = 3926305904 }, - [96] = { X = 304, Y = 504, Sheet = 3926335698 }, - [72] = { X = 840, Y = 536, Sheet = 3926316119 }, - [48] = { X = 108, Y = 212, Sheet = 3926309567 }, - }, - g_translate = { - [72] = { X = 308, Y = 460, Sheet = 3926316119 }, - [36] = { X = 664, Y = 4, Sheet = 3926305904 }, - [96] = { X = 104, Y = 204, Sheet = 3926329330 }, - [48] = { X = 524, Y = 628, Sheet = 3926307971 }, - }, - view_week = { - [72] = { X = 688, Y = 688, Sheet = 3926313458 }, - [36] = { X = 124, Y = 4, Sheet = 3926307971 }, - [96] = { X = 704, Y = 804, Sheet = 3926321212 }, - [48] = { X = 836, Y = 732, Sheet = 3926311105 }, - }, - ondemand_video = { - [72] = { X = 764, Y = 540, Sheet = 3926312257 }, - [36] = { X = 644, Y = 564, Sheet = 3926305904 }, - [96] = { X = 4, Y = 704, Sheet = 3926330123 }, - [48] = { X = 4, Y = 888, Sheet = 3926309567 }, - }, - no_encryption = { - [48] = { X = 316, Y = 784, Sheet = 3926309567 }, - [36] = { X = 724, Y = 884, Sheet = 3926305904 }, - [72] = { X = 308, Y = 232, Sheet = 3926319099 }, - [96] = { X = 904, Y = 504, Sheet = 3926330123 }, - }, - card_travel = { - [72] = { X = 156, Y = 616, Sheet = 3926312257 }, - [36] = { X = 564, Y = 924, Sheet = 3926305904 }, - [96] = { X = 304, Y = 4, Sheet = 3926328650 }, - [48] = { X = 56, Y = 836, Sheet = 3926311105 }, - }, - view_comfy = { - [48] = { X = 524, Y = 472, Sheet = 3926311105 }, - [36] = { X = 884, Y = 884, Sheet = 3926305904 }, - [72] = { X = 612, Y = 460, Sheet = 3926319099 }, - [96] = { X = 204, Y = 504, Sheet = 3926319860 }, - }, - code = { - [72] = { X = 4, Y = 308, Sheet = 3926317787 }, - [36] = { X = 404, Y = 844, Sheet = 3926305904 }, - [96] = { X = 204, Y = 304, Sheet = 3926328650 }, - [48] = { X = 160, Y = 940, Sheet = 3926311105 }, - }, - call_split = { - [72] = { X = 764, Y = 388, Sheet = 3926312257 }, - [36] = { X = 404, Y = 124, Sheet = 3926307971 }, - [96] = { X = 4, Y = 404, Sheet = 3926328650 }, - [48] = { X = 940, Y = 888, Sheet = 3926311105 }, - }, - cast_connected = { - [72] = { X = 460, Y = 312, Sheet = 3926312257 }, - [36] = { X = 444, Y = 964, Sheet = 3926305904 }, - [96] = { X = 704, Y = 4, Sheet = 3926328650 }, - [48] = { X = 524, Y = 784, Sheet = 3926311105 }, - }, - show_chart = { - [72] = { X = 460, Y = 536, Sheet = 3926313458 }, - [36] = { X = 404, Y = 164, Sheet = 3926307971 }, - [96] = { X = 804, Y = 704, Sheet = 3926319860 }, - [48] = { X = 836, Y = 784, Sheet = 3926307971 }, - }, - zoom_out_map = { - [72] = { X = 756, Y = 160, Sheet = 3926312257 }, - [36] = { X = 4, Y = 44, Sheet = 3926307971 }, - [96] = { X = 804, Y = 804, Sheet = 3926319860 }, - [48] = { X = 56, Y = 56, Sheet = 3926312257 }, - }, - format_align_center = { - [72] = { X = 460, Y = 80, Sheet = 3926316119 }, - [36] = { X = 584, Y = 4, Sheet = 3926305904 }, - [96] = { X = 404, Y = 204, Sheet = 3926326846 }, - [48] = { X = 212, Y = 420, Sheet = 3926311105 }, - }, - signal_cellular_1_bar = { - [72] = { X = 536, Y = 688, Sheet = 3926313458 }, - [36] = { X = 364, Y = 4, Sheet = 3926307971 }, - [96] = { X = 604, Y = 904, Sheet = 3926319860 }, - [48] = { X = 472, Y = 576, Sheet = 3926307971 }, - }, - signal_wifi_1_bar = { - [72] = { X = 688, Y = 308, Sheet = 3926313458 }, - [36] = { X = 444, Y = 484, Sheet = 3926307971 }, - [96] = { X = 4, Y = 404, Sheet = 3926319860 }, - [48] = { X = 368, Y = 160, Sheet = 3926309567 }, - }, - format_color_reset = { - [72] = { X = 232, Y = 612, Sheet = 3926317787 }, - [36] = { X = 844, Y = 204, Sheet = 3926305904 }, - [96] = { X = 404, Y = 304, Sheet = 3926326846 }, - [48] = { X = 56, Y = 420, Sheet = 3926311105 }, - }, - motorcycle = { - [48] = { X = 264, Y = 628, Sheet = 3926309567 }, - [36] = { X = 644, Y = 924, Sheet = 3926305904 }, - [72] = { X = 612, Y = 536, Sheet = 3926319099 }, - [96] = { X = 704, Y = 304, Sheet = 3926334787 }, - }, - space_bar = { - [72] = { X = 460, Y = 236, Sheet = 3926312257 }, - [36] = { X = 724, Y = 164, Sheet = 3926307971 }, - [96] = { X = 904, Y = 804, Sheet = 3926319860 }, - [48] = { X = 212, Y = 940, Sheet = 3926309567 }, - }, - work = { - [72] = { X = 612, Y = 768, Sheet = 3926312257 }, - [36] = { X = 924, Y = 364, Sheet = 3926307971 }, - [96] = { X = 104, Y = 904, Sheet = 3926319860 }, - [48] = { X = 420, Y = 316, Sheet = 3926311105 }, - }, - location_searching = { - [48] = { X = 784, Y = 56, Sheet = 3926309567 }, - [36] = { X = 204, Y = 564, Sheet = 3926305904 }, - [72] = { X = 4, Y = 384, Sheet = 3926319099 }, - [96] = { X = 304, Y = 304, Sheet = 3926335698 }, - }, - done_all = { - [72] = { X = 4, Y = 612, Sheet = 3926316119 }, - [36] = { X = 4, Y = 444, Sheet = 3926305904 }, - [96] = { X = 804, Y = 304, Sheet = 3926321212 }, - [48] = { X = 732, Y = 628, Sheet = 3926311105 }, - }, - bluetooth_searching = { - [72] = { X = 384, Y = 80, Sheet = 3926314806 }, - [36] = { X = 604, Y = 364, Sheet = 3926307971 }, - [96] = { X = 204, Y = 904, Sheet = 3926329330 }, - [48] = { X = 108, Y = 680, Sheet = 3926311105 }, - }, - wrap_text = { - [72] = { X = 232, Y = 616, Sheet = 3926312257 }, - [36] = { X = 204, Y = 244, Sheet = 3926307971 }, - [96] = { X = 104, Y = 604, Sheet = 3926319860 }, - [48] = { X = 4, Y = 108, Sheet = 3926312257 }, - }, - shuffle = { - [72] = { X = 460, Y = 388, Sheet = 3926312257 }, - [36] = { X = 164, Y = 44, Sheet = 3926307971 }, - [96] = { X = 404, Y = 504, Sheet = 3926319860 }, - [48] = { X = 420, Y = 836, Sheet = 3926307971 }, - }, - signal_cellular_0_bar = { - [72] = { X = 688, Y = 460, Sheet = 3926313458 }, - [36] = { X = 764, Y = 204, Sheet = 3926307971 }, - [96] = { X = 304, Y = 704, Sheet = 3926319860 }, - [48] = { X = 732, Y = 628, Sheet = 3926309567 }, - }, - short_text = { - [72] = { X = 764, Y = 616, Sheet = 3926312257 }, - [36] = { X = 44, Y = 204, Sheet = 3926307971 }, - [96] = { X = 404, Y = 604, Sheet = 3926319860 }, - [48] = { X = 420, Y = 732, Sheet = 3926307971 }, - }, - new_releases = { - [48] = { X = 160, Y = 784, Sheet = 3926309567 }, - [36] = { X = 44, Y = 764, Sheet = 3926305904 }, - [72] = { X = 4, Y = 308, Sheet = 3926319099 }, - [96] = { X = 304, Y = 804, Sheet = 3926333840 }, - }, - youtube_searched_for = { - [72] = { X = 764, Y = 688, Sheet = 3926313458 }, - [36] = { X = 484, Y = 4, Sheet = 3926307971 }, - [96] = { X = 504, Y = 864, Sheet = 3926319099 }, - [48] = { X = 524, Y = 368, Sheet = 3926311105 }, - }, - flip = { - [72] = { X = 156, Y = 232, Sheet = 3926316119 }, - [36] = { X = 164, Y = 44, Sheet = 3926305904 }, - [96] = { X = 504, Y = 204, Sheet = 3926326846 }, - [48] = { X = 160, Y = 108, Sheet = 3926312257 }, - }, - format_align_left = { - [72] = { X = 232, Y = 308, Sheet = 3926316119 }, - [36] = { X = 4, Y = 44, Sheet = 3926305904 }, - [96] = { X = 704, Y = 304, Sheet = 3926326846 }, - [48] = { X = 316, Y = 472, Sheet = 3926311105 }, - }, - star_outline = { [72] = { X = 916, Y = 232, Sheet = 3926319099 }, [96] = { X = 604, Y = 604, Sheet = 3926319860 } }, - battery_charging_full = { - [72] = { X = 612, Y = 764, Sheet = 3926314806 }, - [36] = { X = 524, Y = 324, Sheet = 3926305904 }, - [96] = { X = 704, Y = 204, Sheet = 3926327588 }, - [48] = { X = 940, Y = 628, Sheet = 3926311105 }, - }, - supervisor_account = { - [72] = { X = 612, Y = 536, Sheet = 3926316119 }, - [36] = { X = 804, Y = 844, Sheet = 3926305904 }, - [96] = { X = 804, Y = 404, Sheet = 3926319860 }, - [48] = { X = 420, Y = 212, Sheet = 3926309567 }, - }, - cast = { - [72] = { X = 156, Y = 920, Sheet = 3926312257 }, - [36] = { X = 804, Y = 884, Sheet = 3926305904 }, - [96] = { X = 4, Y = 104, Sheet = 3926328650 }, - [48] = { X = 784, Y = 784, Sheet = 3926311105 }, - }, - verified_user = { - [48] = { X = 836, Y = 680, Sheet = 3926311105 }, - [36] = { X = 324, Y = 524, Sheet = 3926305904 }, - [72] = { X = 308, Y = 308, Sheet = 3926319099 }, - [96] = { X = 904, Y = 404, Sheet = 3926319860 }, - }, - local_post_office = { - [48] = { X = 524, Y = 264, Sheet = 3926309567 }, - [36] = { X = 4, Y = 604, Sheet = 3926305904 }, - [72] = { X = 688, Y = 80, Sheet = 3926319099 }, - [96] = { X = 404, Y = 204, Sheet = 3926335698 }, - }, - public = { - [72] = { X = 156, Y = 840, Sheet = 3926313458 }, - [36] = { X = 604, Y = 324, Sheet = 3926305904 }, - [96] = { X = 104, Y = 604, Sheet = 3926333840 }, - [48] = { X = 56, Y = 264, Sheet = 3926309567 }, - }, - query_builder = { - [72] = { X = 460, Y = 156, Sheet = 3926313458 }, - [36] = { X = 724, Y = 324, Sheet = 3926305904 }, - [96] = { X = 904, Y = 504, Sheet = 3926333840 }, - [48] = { X = 108, Y = 368, Sheet = 3926309567 }, - }, - screen_lock_landscape = { - [72] = { X = 80, Y = 764, Sheet = 3926314806 }, - [36] = { X = 764, Y = 324, Sheet = 3926305904 }, - [96] = { X = 404, Y = 204, Sheet = 3926330123 }, - [48] = { X = 680, Y = 628, Sheet = 3926309567 }, - }, - alarm_add = { - [72] = { X = 308, Y = 764, Sheet = 3926314806 }, - [36] = { X = 684, Y = 324, Sheet = 3926305904 }, - [96] = { X = 4, Y = 804, Sheet = 3926328650 }, - [48] = { X = 264, Y = 472, Sheet = 3926311105 }, - }, - signal_cellular_connected_no_internet_2_bar = { - [72] = { X = 4, Y = 840, Sheet = 3926314806 }, - [36] = { X = 84, Y = 324, Sheet = 3926305904 }, - [96] = { X = 504, Y = 904, Sheet = 3926321212 }, - [48] = { X = 836, Y = 628, Sheet = 3926309567 }, - }, - graphic_eq = { - [72] = { X = 460, Y = 384, Sheet = 3926316119 }, - [36] = { X = 724, Y = 44, Sheet = 3926305904 }, - [96] = { X = 104, Y = 4, Sheet = 3926333840 }, - [48] = { X = 912, Y = 524, Sheet = 3926307971 }, - }, - subject = { - [48] = { X = 836, Y = 212, Sheet = 3926309567 }, - [36] = { X = 764, Y = 484, Sheet = 3926305904 }, - [72] = { X = 308, Y = 4, Sheet = 3926319099 }, - [96] = { X = 704, Y = 404, Sheet = 3926319860 }, - }, - watch_later = { - [72] = { X = 688, Y = 156, Sheet = 3926313458 }, - [36] = { X = 324, Y = 324, Sheet = 3926305904 }, - [96] = { X = 104, Y = 304, Sheet = 3926319860 }, - [48] = { X = 316, Y = 524, Sheet = 3926311105 }, - }, - network_wifi = { - [72] = { X = 4, Y = 156, Sheet = 3926317787 }, - [36] = { X = 884, Y = 724, Sheet = 3926305904 }, - [96] = { X = 104, Y = 804, Sheet = 3926333840 }, - [48] = { X = 4, Y = 784, Sheet = 3926309567 }, - }, - format_size = { - [72] = { X = 460, Y = 232, Sheet = 3926316119 }, - [36] = { X = 684, Y = 204, Sheet = 3926305904 }, - [96] = { X = 404, Y = 504, Sheet = 3926327588 }, - [48] = { X = 160, Y = 940, Sheet = 3926307971 }, - }, - warning = { - [72] = { X = 232, Y = 156, Sheet = 3926313458 }, - [36] = { X = 364, Y = 324, Sheet = 3926305904 }, - [96] = { X = 104, Y = 704, Sheet = 3926321212 }, - [48] = { X = 472, Y = 628, Sheet = 3926311105 }, - }, - thumb_up = { - [72] = { X = 688, Y = 612, Sheet = 3926317787 }, - [36] = { X = 324, Y = 244, Sheet = 3926305904 }, - [96] = { X = 504, Y = 504, Sheet = 3926319860 }, - [48] = { X = 940, Y = 940, Sheet = 3926307971 }, - }, - dehaze = { - [48] = { X = 836, Y = 4, Sheet = 3926311105 }, - [36] = { X = 84, Y = 644, Sheet = 3926305904 }, - [72] = { X = 916, Y = 156, Sheet = 3926319099 }, - [96] = { X = 4, Y = 4, Sheet = 3926326846 }, - }, - publish = { - [72] = { X = 916, Y = 80, Sheet = 3926313458 }, - [36] = { X = 284, Y = 324, Sheet = 3926305904 }, - [96] = { X = 504, Y = 504, Sheet = 3926333840 }, - [48] = { X = 316, Y = 264, Sheet = 3926309567 }, - }, - nature_people = { - [48] = { X = 524, Y = 680, Sheet = 3926309567 }, - [36] = { X = 484, Y = 844, Sheet = 3926305904 }, - [72] = { X = 688, Y = 384, Sheet = 3926319099 }, - [96] = { X = 4, Y = 104, Sheet = 3926334787 }, - }, - portable_wifi_off = { - [72] = { X = 384, Y = 764, Sheet = 3926314806 }, - [36] = { X = 844, Y = 324, Sheet = 3926305904 }, - [96] = { X = 704, Y = 204, Sheet = 3926329330 }, - [48] = { X = 56, Y = 108, Sheet = 3926309567 }, - }, - keyboard_return = { - [72] = { X = 232, Y = 232, Sheet = 3926314806 }, - [36] = { X = 524, Y = 284, Sheet = 3926305904 }, - [96] = { X = 704, Y = 104, Sheet = 3926333840 }, - [48] = { X = 732, Y = 940, Sheet = 3926307971 }, - }, - sd_storage = { - [72] = { X = 232, Y = 688, Sheet = 3926314806 }, - [36] = { X = 364, Y = 364, Sheet = 3926305904 }, - [96] = { X = 904, Y = 104, Sheet = 3926330123 }, - [48] = { X = 680, Y = 576, Sheet = 3926307971 }, - }, - gradient = { - [72] = { X = 308, Y = 384, Sheet = 3926316119 }, - [36] = { X = 904, Y = 4, Sheet = 3926305904 }, - [96] = { X = 204, Y = 704, Sheet = 3926334787 }, - [48] = { X = 836, Y = 888, Sheet = 3926307971 }, - }, - network_cell = { - [72] = { X = 4, Y = 460, Sheet = 3926317787 }, - [36] = { X = 84, Y = 804, Sheet = 3926305904 }, - [96] = { X = 104, Y = 404, Sheet = 3926334787 }, - [48] = { X = 576, Y = 732, Sheet = 3926309567 }, - }, - http = { - [72] = { X = 764, Y = 840, Sheet = 3926317787 }, - [36] = { X = 604, Y = 164, Sheet = 3926305904 }, - [96] = { X = 904, Y = 504, Sheet = 3926334787 }, - [48] = { X = 784, Y = 628, Sheet = 3926309567 }, - }, - folder_special = { - [72] = { X = 460, Y = 4, Sheet = 3926316119 }, - [36] = { X = 984, Y = 4, Sheet = 3926305904 }, - [96] = { X = 604, Y = 404, Sheet = 3926326846 }, - [48] = { X = 316, Y = 108, Sheet = 3926312257 }, - }, - airline_seat_legroom_reduced = { - [72] = { X = 612, Y = 460, Sheet = 3926314806 }, - [36] = { X = 244, Y = 364, Sheet = 3926305904 }, - [96] = { X = 104, Y = 204, Sheet = 3926328650 }, - [48] = { X = 264, Y = 108, Sheet = 3926312257 }, - }, - highlight = { - [72] = { X = 4, Y = 536, Sheet = 3926317787 }, - [36] = { X = 804, Y = 124, Sheet = 3926305904 }, - [96] = { X = 904, Y = 704, Sheet = 3926334787 }, - [48] = { X = 524, Y = 576, Sheet = 3926307971 }, - }, - card_giftcard = { - [72] = { X = 916, Y = 388, Sheet = 3926312257 }, - [36] = { X = 844, Y = 964, Sheet = 3926305904 }, - [96] = { X = 404, Y = 4, Sheet = 3926328650 }, - [48] = { X = 940, Y = 108, Sheet = 3926311105 }, - }, - block = { - [72] = { X = 916, Y = 764, Sheet = 3926314806 }, - [36] = { X = 404, Y = 364, Sheet = 3926305904 }, - [96] = { X = 304, Y = 304, Sheet = 3926327588 }, - [48] = { X = 524, Y = 316, Sheet = 3926309567 }, - }, - contacts = { - [48] = { X = 4, Y = 108, Sheet = 3926311105 }, - [36] = { X = 964, Y = 924, Sheet = 3926305904 }, - [72] = { X = 536, Y = 460, Sheet = 3926319099 }, - [96] = { X = 404, Y = 804, Sheet = 3926326846 }, - }, - unarchive = { - [72] = { X = 384, Y = 916, Sheet = 3926316119 }, - [36] = { X = 924, Y = 404, Sheet = 3926305904 }, - [96] = { X = 504, Y = 204, Sheet = 3926319860 }, - [48] = { X = 212, Y = 316, Sheet = 3926309567 }, - }, - trending_down = { - [72] = { X = 840, Y = 232, Sheet = 3926314806 }, - [36] = { X = 684, Y = 284, Sheet = 3926305904 }, - [96] = { X = 604, Y = 204, Sheet = 3926319860 }, - [48] = { X = 888, Y = 472, Sheet = 3926311105 }, - }, - wallpaper = { - [72] = { X = 688, Y = 80, Sheet = 3926314806 }, - [36] = { X = 444, Y = 364, Sheet = 3926305904 }, - [96] = { X = 504, Y = 404, Sheet = 3926319860 }, - [48] = { X = 576, Y = 316, Sheet = 3926309567 }, - }, - wifi_tethering = { - [72] = { X = 536, Y = 688, Sheet = 3926314806 }, - [36] = { X = 924, Y = 324, Sheet = 3926305904 }, - [96] = { X = 104, Y = 864, Sheet = 3926319099 }, - [48] = { X = 212, Y = 160, Sheet = 3926312257 }, - }, - stay_primary_landscape = { - [48] = { X = 4, Y = 732, Sheet = 3926309567 }, - [36] = { X = 684, Y = 924, Sheet = 3926305904 }, - [72] = { X = 80, Y = 536, Sheet = 3926319099 }, - [96] = { X = 204, Y = 804, Sheet = 3926321212 }, - }, - pin_drop = { - [72] = { X = 80, Y = 688, Sheet = 3926314806 }, - [36] = { X = 524, Y = 324, Sheet = 3926307971 }, - [96] = { X = 404, Y = 604, Sheet = 3926330123 }, - [48] = { X = 576, Y = 472, Sheet = 3926309567 }, - }, - bluetooth_audio = { - [72] = { X = 840, Y = 80, Sheet = 3926314806 }, - [36] = { X = 564, Y = 364, Sheet = 3926305904 }, - [96] = { X = 304, Y = 104, Sheet = 3926328650 }, - [48] = { X = 420, Y = 316, Sheet = 3926309567 }, - }, - keyboard_backspace = { - [72] = { X = 612, Y = 384, Sheet = 3926314806 }, - [36] = { X = 564, Y = 244, Sheet = 3926305904 }, - [96] = { X = 204, Y = 104, Sheet = 3926333840 }, - [48] = { X = 264, Y = 940, Sheet = 3926307971 }, - }, - wifi_lock = { - [72] = { X = 460, Y = 4, Sheet = 3926314806 }, - [36] = { X = 564, Y = 324, Sheet = 3926305904 }, - [96] = { X = 804, Y = 804, Sheet = 3926321212 }, - [48] = { X = 316, Y = 264, Sheet = 3926311105 }, - }, - blur_off = { - [72] = { X = 612, Y = 156, Sheet = 3926314806 }, - [36] = { X = 804, Y = 244, Sheet = 3926307971 }, - [96] = { X = 304, Y = 904, Sheet = 3926329330 }, - [48] = { X = 836, Y = 576, Sheet = 3926311105 }, - }, - crop_16_9 = { - [72] = { X = 688, Y = 4, Sheet = 3926317787 }, - [36] = { X = 764, Y = 724, Sheet = 3926305904 }, - [96] = { X = 604, Y = 904, Sheet = 3926326846 }, - [48] = { X = 472, Y = 56, Sheet = 3926311105 }, - }, - subdirectory_arrow_right = { - [48] = { X = 680, Y = 264, Sheet = 3926309567 }, - [36] = { X = 444, Y = 604, Sheet = 3926305904 }, - [72] = { X = 460, Y = 764, Sheet = 3926319099 }, - [96] = { X = 4, Y = 704, Sheet = 3926321212 }, - }, - dns = { - [72] = { X = 612, Y = 840, Sheet = 3926316119 }, - [36] = { X = 444, Y = 524, Sheet = 3926305904 }, - [96] = { X = 604, Y = 304, Sheet = 3926321212 }, - [48] = { X = 4, Y = 368, Sheet = 3926309567 }, - }, - local_cafe = { - [72] = { X = 536, Y = 916, Sheet = 3926316119 }, - [36] = { X = 724, Y = 404, Sheet = 3926305904 }, - [96] = { X = 204, Y = 704, Sheet = 3926335698 }, - [48] = { X = 784, Y = 108, Sheet = 3926309567 }, - }, - sync_problem = { - [72] = { X = 80, Y = 460, Sheet = 3926314806 }, - [36] = { X = 844, Y = 284, Sheet = 3926305904 }, - [96] = { X = 204, Y = 204, Sheet = 3926321212 }, - [48] = { X = 628, Y = 940, Sheet = 3926307971 }, - }, - airline_seat_recline_normal = { - [72] = { X = 536, Y = 156, Sheet = 3926314806 }, - [36] = { X = 4, Y = 284, Sheet = 3926305904 }, - [96] = { X = 804, Y = 104, Sheet = 3926328650 }, - [48] = { X = 576, Y = 108, Sheet = 3926312257 }, - }, - extension = { - [72] = { X = 156, Y = 384, Sheet = 3926314806 }, - [36] = { X = 924, Y = 244, Sheet = 3926305904 }, - [96] = { X = 904, Y = 704, Sheet = 3926327588 }, - [48] = { X = 888, Y = 524, Sheet = 3926311105 }, - }, - power_input = { - [72] = { X = 4, Y = 156, Sheet = 3926314806 }, - [36] = { X = 84, Y = 284, Sheet = 3926305904 }, - [96] = { X = 804, Y = 304, Sheet = 3926329330 }, - [48] = { X = 732, Y = 212, Sheet = 3926309567 }, - }, - sd_card = { - [72] = { X = 156, Y = 612, Sheet = 3926314806 }, - [36] = { X = 204, Y = 284, Sheet = 3926305904 }, - [96] = { X = 704, Y = 104, Sheet = 3926330123 }, - [48] = { X = 576, Y = 628, Sheet = 3926307971 }, - }, -} diff --git a/src/IconLabel/Spritesheet/init.lua b/src/IconLabel/Spritesheet/init.lua deleted file mode 100644 index 5c3e36cc..00000000 --- a/src/IconLabel/Spritesheet/init.lua +++ /dev/null @@ -1,7 +0,0 @@ -local sprites = {} -for i, mod in ipairs(script:GetChildren()) do - for k, v in pairs(require(mod)) do - sprites[k] = v - end -end -return sprites diff --git a/src/IconLabel/demo.story.lua b/src/IconLabel/demo.story.lua deleted file mode 100644 index 24efd43b..00000000 --- a/src/IconLabel/demo.story.lua +++ /dev/null @@ -1,21 +0,0 @@ ---!strict -return function(coreGui) - local object - task.spawn(function() - local module = require(script.Parent) - local demo = { - IconColor3 = Color3.new(1, 1, 1), - Icon = "settings", - BackgroundTransparency = 1, - Position = UDim2.fromScale(0.5, 0.5), - AnchorPoint = Vector2.new(0.5, 0.5), - Parent = coreGui, - Size = UDim2.fromOffset(32, 32), - } - object = module()(demo) - end) - - return function() - object:Destroy() - end -end diff --git a/src/IconLabel/init.lua b/src/IconLabel/init.lua deleted file mode 100644 index 6dcf9120..00000000 --- a/src/IconLabel/init.lua +++ /dev/null @@ -1,147 +0,0 @@ ---!strict -local Package = script.Parent -assert(Package) -local Packages = Package.Parent -assert(Packages) - -local RunService = game:GetService("RunService") - -local Util = require(Package:WaitForChild("Util")) - -local Types = require(Package:WaitForChild("Types")) - -local ColdFusion = require(Packages:WaitForChild("ColdFusion")) -type Fuse = ColdFusion.Fuse -type State = ColdFusion.State -type ValueState = ColdFusion.ValueState -type CanBeState = ColdFusion.CanBeState - -local Maid = require(Packages:WaitForChild("Maid")) -type Maid = Maid.Maid - -local Spritesheet = require(script:WaitForChild("Spritesheet")) - -export type IconLabelParameters = Types.ImageLabelParameters & { - IconTransparency: CanBeState?, - IconColor3: CanBeState?, - Icon: CanBeState?, -} - -export type IconLabel = ImageLabel - -function Constructor(config: IconLabelParameters): IconLabel - -- init workspace - local maid = Maid.new() - local _fuse = ColdFusion.fuse(maid) - local _new = _fuse.new - local _bind = _fuse.bind - local _import = _fuse.import - local _Value = _fuse.Value - local _Computed = _fuse.Computed - - -- unload config states - local Name = _import(config.Name, script.Name) - local IconTransparency = _import(config.IconTransparency, 0) - local IconColor3 = _import(config.IconColor3, Color3.new(1, 1, 1)) - local Icon: State = _import(config.Icon, nil :: string?) - - -- init internal states - local AbsoluteSize = _Value(Vector2.new(0, 0)) - local OutputState = _Value(nil :: IconLabel?) - local DotsPerInch = _Value(36) - local IconData = _Computed(function(key: string?, dpi): any - if not key or key == "" then - return nil - end - assert(key ~= nil) - local iconResolutions = Spritesheet[string.lower(key)] or {} - return iconResolutions[dpi] - end, Icon, DotsPerInch) - - -- bind state changes - maid:GiveTask(AbsoluteSize:Connect(function() - local output = OutputState:Get() - if not output or not output:IsDescendantOf(game) then - return - end - assert(output ~= nil) - local dpi = math.min(output.AbsoluteSize.X, output.AbsoluteSize.Y) - local options = { 36, 48, 72, 96 } - local closest = 36 - local closestDelta = nil - - for i, res in ipairs(options) do - if dpi % res == 0 or res % dpi == 0 then - closest = res - break - elseif not closestDelta or math.abs(res - dpi) < closestDelta then - closest = res - closestDelta = math.abs(res - dpi) - end - end - - DotsPerInch:Set(closest) - end)) - - -- assemble final parameters - local parameters: any = { - Name = Name, - BackgroundTransparency = 1, - Image = _Computed(function(iconData, key: string?) - if not key or key == "" then - return "" - end - if not iconData then - return key or "" - end - return "rbxassetid://" .. iconData.Sheet - end, IconData, Icon), - ImageRectOffset = _Computed(function(iconData) - if not iconData then - return Vector2.new(0, 0) - end - return Vector2.new(iconData.X, iconData.Y) - end, IconData), - ImageRectSize = _Computed(function(dpi: number, iconData) - if iconData then - return Vector2.new(dpi, dpi) - else - return Vector2.new(0, 0) - end - end, DotsPerInch, IconData), - ImageColor3 = IconColor3, - ImageTransparency = IconTransparency, - } - - config.IconTransparency = nil - config.IconColor3 = nil - config.Icon = nil - - for k, v in pairs(config) do - if parameters[k] == nil then - parameters[k] = v - end - end - - -- construct output instance - local Output = _fuse.new("ImageLabel")(parameters) :: ImageLabel - OutputState:Set(Output) - - maid:GiveTask(RunService.RenderStepped:Connect(function(deltaTime: number) - AbsoluteSize:Set(Output.AbsoluteSize) - end)) - - Util.cleanUpPrep(maid, Output) - - return Output -end - -return function(maid: Maid?) - return function(params: IconLabelParameters): IconLabel - local inst = Constructor(params) - if maid then - maid:GiveTask(inst) - end - return inst - end -end diff --git a/src/RadioButton/demo.story.lua b/src/RadioButton/demo.story.lua deleted file mode 100644 index 538067f5..00000000 --- a/src/RadioButton/demo.story.lua +++ /dev/null @@ -1,39 +0,0 @@ ---!strict --- local ReplicatedStorage = game:GetService("ReplicatedStorage") -return function(coreGui) - local RadioButton = script.Parent - assert(RadioButton) - local Package = RadioButton.Parent - assert(Package) - local Packages = Package.Parent - assert(Packages) - local module = require(script.Parent) - local Maid = require(Packages:WaitForChild("Maid")) - local ColdFusion = require(Packages:WaitForChild("ColdFusion")) - - local maid = Maid.new() - local _fuse = ColdFusion.fuse(maid) - - local _new = _fuse.new - local _bind = _fuse.bind - local _import = _fuse.import - - local _Value = _fuse.Value - local _Computed = _fuse.Computed - - local demo: module.RadioButtonParameters = { - Scale = 2, - BackgroundColor3 = Color3.fromHSV(0.75, 0.5, 1), - BorderColor3 = Color3.fromHSV(0, 0, 0.4), - Position = UDim2.fromScale(0.5, 0.5), - AnchorPoint = Vector2.new(0.5, 0.5), - Value = _Value(false), - Parent = coreGui, - -- EnableSound = ReplicatedStorage.Library.Sounds.UI.Button.Confirm["1"]:Clone(), - -- DisableSound = ReplicatedStorage.Library.Sounds.UI.Button.Cancel:Clone(), - } :: any - module(maid)(demo) - return function() - maid:Destroy() - end -end diff --git a/src/RadioButton/init.lua b/src/RadioButton/init.lua deleted file mode 100644 index 12849f41..00000000 --- a/src/RadioButton/init.lua +++ /dev/null @@ -1,217 +0,0 @@ ---!strict -local SoundService = game:GetService("SoundService") - -local Package = script.Parent -assert(Package) -local Packages = Package.Parent -assert(Packages) - -local Util = require(Package:WaitForChild("Util")) - -local Types = require(Package:WaitForChild("Types")) - -local ColdFusion = require(Packages:WaitForChild("ColdFusion")) -type Fuse = ColdFusion.Fuse -type State = ColdFusion.State -type ValueState = ColdFusion.ValueState -type CanBeState = ColdFusion.CanBeState - -local Maid = require(Packages:WaitForChild("Maid")) -type Maid = Maid.Maid - -local Signal = require(Packages:WaitForChild("Signal")) - -local Bubble = require(Package:WaitForChild("Bubble")) - -local RadioButton = {} -RadioButton.__index = RadioButton - -export type RadioButtonParameters = Types.FrameParameters & { - Scale: CanBeState?, - BorderColor3: CanBeState?, - BackgroundColor3: CanBeState?, - Value: ValueState, - EnableSound: CanBeState?, - DisableSound: CanBeState?, -} - -export type RadioButton = Frame - -function Constructor(config: RadioButtonParameters): RadioButton - -- init workspace - local maid = Maid.new() - local _fuse = ColdFusion.fuse(maid) - local _new = _fuse.new - local _bind = _fuse.bind - local _import = _fuse.import - local _Value = _fuse.Value - local _Computed = _fuse.Computed - - -- unload config states - local Name = _import(config.Name, script.Name) - local Scale = _import(config.Scale, 1) - local BorderColor3: State = _import(config.BorderColor3, Color3.fromHSV(0, 0, 0.4)) :: any - local BackgroundColor3: State = _import(config.BackgroundColor3, Color3.fromHSV(0.6, 1, 1)) :: any - local Value = config.Value - local EnableSound: State = _import(config.EnableSound, nil) :: any - local DisableSound: State = _import(config.DisableSound, nil) :: any - - -- construct signals - local Activated = Signal.new() - maid:GiveTask(Activated) - - -- init internal states - local OutputState = _Value(nil :: RadioButton?) - local BubbleEnabled = _Value(false) - local Padding = _Computed(function(scale) - return math.round(6 * scale) - end, Scale) - local Width = _Computed(function(scale: number) - return math.round(scale * 20) - end, Scale) - - -- bind Signal - maid:GiveTask(Activated:Connect(function() - if Value:Get() == true then - local clickSound = EnableSound:Get() - if clickSound then - SoundService:PlayLocalSound(clickSound) - end - else - local clickSound = DisableSound:Get() - if clickSound then - SoundService:PlayLocalSound(clickSound) - end - end - if Value.Set then - Value:Set(not Value:Get()) - end - if BubbleEnabled:Get() == false then - BubbleEnabled:Set(true) - task.wait(0.2) - BubbleEnabled:Set(false) - end - end)) - - -- assemble final parameters - local parameters: any = { - Name = Name, - Size = _Computed(function(width: number) - return UDim2.fromOffset(width * 2, width * 2) - end, Width), - BackgroundTransparency = 1, - Children = { - _new("ImageButton")({ - Name = "Button", - ZIndex = 3, - BackgroundTransparency = 1, - ImageTransparency = 1, - Position = UDim2.fromScale(0.5, 0.5), - Size = UDim2.fromScale(1, 1), - AnchorPoint = Vector2.new(0.5, 0.5), - Events = { - Activated = function() - Activated:Fire() - if BubbleEnabled:Get() then - local bubble = Bubble(maid)({ - Parent = OutputState :: any, - }) - local fireFunction: Instance? = bubble:WaitForChild("Fire") - assert(fireFunction ~= nil and fireFunction:IsA("BindableFunction")) - fireFunction:Invoke() - end - end, - }, - }), - _new("Frame")({ - Name = "Frame", - ZIndex = 2, - Position = UDim2.fromScale(0.5, 0.5), - AnchorPoint = Vector2.new(0.5, 0.5), - BackgroundColor3 = BackgroundColor3, - BackgroundTransparency = 0.999, - Size = _Computed(function(width: number, padding: number) - return UDim2.fromOffset(width - padding, width - padding) - end, Width, Padding), - BorderSizePixel = 0, - Children = { - _new("Frame")({ - Name = "Fill", - Size = _Computed(function(width: number, padding: number): UDim2 - local w = math.round(width - padding * 2) - return UDim2.fromOffset(w, w) - end, Width, Padding), - BackgroundColor3 = BackgroundColor3, - BackgroundTransparency = _Computed(function(val) - if val then - return 0 - else - return 1 - end - end, Value):Tween(), - Children = { - _new("UICorner")({ - CornerRadius = _Computed(function(padding) - return UDim.new(1, 0) - end, Padding), - }), - } :: { Instance }, - Position = UDim2.fromScale(0.5, 0.5), - AnchorPoint = Vector2.new(0.5, 0.5), - }), - _new("UICorner")({ - CornerRadius = _Computed(function(padding) - return UDim.new(1, 0) - end, Padding), - }), - _new("UIStroke")({ - ApplyStrokeMode = Enum.ApplyStrokeMode.Border, - Thickness = _Computed(function(padding: number) - return math.round(padding * 0.25) - end, Padding), - Transparency = 0, - Color = _Computed(function(val: boolean, border: Color3, background: Color3) - if val then - return background - else - return border - end - end, Value, BorderColor3, BackgroundColor3):Tween(), - }), - } :: { Instance }, - }), - } :: { Instance }, - } - - config.Scale = nil - config.BorderColor3 = nil - config.BackgroundColor3 = nil - config.Value = nil :: any - config.EnableSound = nil - config.DisableSound = nil - - for k, v in pairs(config) do - if parameters[k] == nil then - parameters[k] = v - end - end - - -- construct output instance - local Output = _new("Frame")(parameters) :: any - OutputState:Set(Output) - Util.cleanUpPrep(maid, Output) - - Util.bindSignal(Output, maid, "Activated", Activated) - - return Output -end - -return function(maid: Maid?) - return function(params: RadioButtonParameters): RadioButton - local inst = Constructor(params) - if maid then - maid:GiveTask(inst) - end - return inst - end -end diff --git a/src/Slider/demo.story.lua b/src/Slider/demo.story.lua deleted file mode 100644 index 0d371459..00000000 --- a/src/Slider/demo.story.lua +++ /dev/null @@ -1,23 +0,0 @@ ---!strict - --- local ReplicatedStorage = game:GetService("ReplicatedStorage") -return function(coreGui) - local module = require(script.Parent) - local demo = { - EnabledColor3 = Color3.fromHSV(0.6, 1, 1), - Position = UDim2.fromScale(0.5, 0.5), - AnchorPoint = Vector2.new(0.5, 0.5), - Padding = UDim.new(0, 2), - Size = UDim2.fromOffset(150, 30), - BorderSizePixel = 8, - Parent = coreGui, - HintEnabled = true, - -- EnableSound = ReplicatedStorage.Library.Sounds.UI.Button.Confirm["1"], - -- DisableSound = ReplicatedStorage.Library.Sounds.UI.Button.Cancel, - -- TickSound = ReplicatedStorage.Library.Sounds.UI.Tap["1"], - } - local object = module()(demo) - return function() - object:Destroy() - end -end diff --git a/src/Slider/init.lua b/src/Slider/init.lua deleted file mode 100644 index db340b60..00000000 --- a/src/Slider/init.lua +++ /dev/null @@ -1,328 +0,0 @@ ---!strict -local SoundService = game:GetService("SoundService") -local UserInputService = game:GetService("UserInputService") -local RunService = game:GetService("RunService") - -local Package = script.Parent -assert(Package) -local Packages = Package.Parent -assert(Packages) - -local Util = require(Package:WaitForChild("Util")) - -local Types = require(Package:WaitForChild("Types")) - -local ColdFusion = require(Packages:WaitForChild("ColdFusion")) -type Fuse = ColdFusion.Fuse -type State = ColdFusion.State -type ValueState = ColdFusion.ValueState -type CanBeState = ColdFusion.CanBeState - -local Maid = require(Packages:WaitForChild("Maid")) -type Maid = Maid.Maid - -local Signal = require(Packages:WaitForChild("Signal")) - -local Bubble = require(Package:WaitForChild("Bubble")) -local Hint = require(Package:WaitForChild("Hint")) - -export type SliderParameters = Types.FrameParameters & { - EnabledColor3: CanBeState?, - HintBackgroundColor3: CanBeState?, - TextColor3: CanBeState?, - TickSound: CanBeState?, - EnableSound: CanBeState?, - DisableSound: CanBeState?, - Input: CanBeState?, - Minimum: CanBeState?, - Maximum: CanBeState?, - Increment: CanBeState?, - Padding: CanBeState?, - BubbleEnabled: CanBeState?, - HintEnabled: CanBeState?, -} - -export type Slider = Frame - -function Constructor(config: SliderParameters): Slider - -- init workspace - local maid = Maid.new() - local _fuse = ColdFusion.fuse(maid) - local _new = _fuse.new - local _bind = _fuse.bind - local _import = _fuse.import - local _Value = _fuse.Value - local _Computed = _fuse.Computed - - -- unload config states - local Name = _import(config.Name, script.Name) - local BackgroundColor3 = _import(config.BackgroundColor3, Color3.fromHSV(0, 0, 0.9)) - local EnabledColor3 = _import(config.EnabledColor3, Color3.fromHSV(0.6, 1, 1)) - local HintBackgroundColor3 = _import(config.HintBackgroundColor3, Color3.fromHSV(0, 0, 0.5)) - local TextColor3 = _import(config.TextColor3, Color3.fromHSV(0, 0, 0.2)) - local TickSound = _import(config.TickSound, nil) - local EnableSound = _import(config.EnableSound, nil) - local DisableSound = _import(config.DisableSound, nil) - local Input = _Value(if typeof(config.Input) == "number" then config.Input elseif typeof(config.Input) == "table" then config.Input:Get() else 5) - local Minimum = _import(config.Minimum, 0) - local Maximum = _import(config.Maximum, 10) - local Increment = _import(config.Increment, 1) - local BorderSizePixel = _import(config.BorderSizePixel, 4) - local Padding = _import(config.Padding, UDim.new(0, 4)) - local Size = _import(config.Size, UDim2.fromOffset(150, 50)) - local BubbleEnabled = _import(config.BubbleEnabled, true) - local HintEnabled = _import(config.HintEnabled, true) - - -- construct signals - local OnRelease = Signal.new() - maid:GiveTask(OnRelease) - - -- init internal states - local Dragging = _Value(false) - local ButtonAbsolutePosition = _Value(Vector2.new(0, 0)) - local ButtonAbsoluteSize = _Value(Vector2.new(0, 0)) - local Value = _Computed(function(input: number, min: number, max: number, inc: number): number - local val = input - (input % inc) --math.round(input * inc)/inc - if val ~= val then - val = min - end - return math.clamp(val, min, max) - end, Input, Minimum, Maximum, Increment) - local Alpha = _Computed(function(val: number, min: number, max: number) - return (val - min) / (max - min) - end, Value, Minimum, Maximum) - - -- bind internal states - maid:GiveTask(Value:Connect(function() - local tickSound = TickSound:Get() - if tickSound then - SoundService:PlayLocalSound(tickSound) - end - end)) - local Diameter = _Computed(function(size: UDim2, padding: UDim) - return size.Y.Offset - padding.Offset * 2 - end, Size, Padding) - - -- construct sub-instances - local Knob: any = _fuse.new("Frame")({ - Name = "Knob", - ZIndex = 2, - Position = _Computed(function(val: number): UDim2 - return UDim2.fromScale(val, 0.5) - end, Alpha), - AnchorPoint = _Computed(function(val: number): Vector2 - return Vector2.new(val, 0.5) - end, Alpha), - Size = UDim2.fromScale(1, 1), - SizeConstraint = Enum.SizeConstraint.RelativeYY, - BackgroundTransparency = 1, - Children = { - _fuse.new("Frame")({ - Name = "Frame", - ZIndex = 2, - Position = UDim2.fromScale(0.5, 0.5), - AnchorPoint = Vector2.new(0.5, 0.5), - BackgroundColor3 = EnabledColor3:Tween(), - Size = _Computed(function(diameter: number) - return UDim2.fromOffset(diameter, diameter) - end, Diameter), - BorderSizePixel = 0, - Children = { - _fuse.new("UICorner")({ - CornerRadius = _Computed(function(padding: UDim) - return UDim.new(1, 0) - end, Padding), - }), - _fuse.new("UIStroke")({ - ApplyStrokeMode = Enum.ApplyStrokeMode.Border, - Thickness = _Computed(function(padding: UDim) - return 1 --math.round(padding*0.25) - end, Padding), - Transparency = 0.8, - }), - } :: { Instance }, - }), - } :: { Instance }, - }) - - local _Hint = Hint(maid)({ - Parent = Knob, - Override = true, - AnchorPoint = Vector2.new(0, -1), - BackgroundColor3 = HintBackgroundColor3, - TextColor3 = TextColor3, - Padding = UDim.new(0, 4), - Enabled = _Computed(function(drag: boolean, enab: boolean): boolean - return drag and enab - end, Dragging, HintEnabled), - Text = _Computed(function(val): string - return tostring(val) - end, Value), - }) - - local Button = _fuse.new("ImageButton")({ - Name = "Button", - ZIndex = 3, - BackgroundTransparency = 1, - ImageTransparency = 1, - Position = UDim2.fromScale(0.5, 0.5), - Size = UDim2.fromScale(1, 1), - AnchorPoint = Vector2.new(0.5, 0.5), - Events = { - MouseButton1Down = function() - Dragging:Set(true) - if BubbleEnabled:Get() then - local bubble = Bubble(maid)({ - Parent = Knob, - FinalTransparency = 0.7, - BackgroundTransparency = 1, - BackgroundColor3 = EnabledColor3, - Scale = 1.75, - }) - maid._currentBubble = function() - if bubble and bubble:IsDescendantOf(game) then - local destFunction: Instance? = bubble:FindFirstChild("Disable") - assert(destFunction ~= nil and destFunction:IsA("BindableFunction")) - if destFunction then - destFunction:Invoke() - else - bubble:Destroy() - end - end - end - local enabFunction: Instance? = bubble:WaitForChild("Enable") - assert(enabFunction ~= nil and enabFunction:IsA("BindableFunction")) - enabFunction:Invoke() - local enabSound = EnableSound:Get() - if enabSound then - SoundService:PlayLocalSound(enabSound) - end - end - end :: any, - }, - }) :: ImageButton - - maid:GiveTask(RunService.RenderStepped:Connect(function() - ButtonAbsolutePosition:Set(Button.AbsolutePosition) - ButtonAbsoluteSize:Set(Button.AbsoluteSize) - end)) - - -- assemble output parameters - local parameters = { - Name = Name, - Size = Size, - BackgroundTransparency = 1, - Children = { - Button, - _fuse.new("Frame")({ - Name = "Frame", - ZIndex = 1, - Size = UDim2.fromScale(1, 1), - Position = UDim2.fromScale(0.5, 0.5), - AnchorPoint = Vector2.new(0.5, 0.5), - BackgroundTransparency = 1, - Children = { - _fuse.new("Frame")({ - Name = "Track", - ZIndex = 1, - BackgroundTransparency = 0.5, - Position = UDim2.fromScale(0.5, 0.5), - AnchorPoint = Vector2.new(0.5, 0.5), - Size = _Computed(function(diameter, bsp) - return UDim2.new(1, -diameter, 0, bsp) - end, Diameter, BorderSizePixel), - BackgroundColor3 = Color3.new(1, 1, 1), - Children = { - _fuse.new("UICorner")({ - CornerRadius = UDim.new(0.5, 0), - }), - _fuse.new("UIGradient")({ - Color = _Computed(function(back, enab, alpha: number) - local bump = 0.001 - return ColorSequence.new({ - ColorSequenceKeypoint.new(0, enab), - ColorSequenceKeypoint.new(math.clamp(alpha - bump, bump, 1 - bump * 2), enab), - ColorSequenceKeypoint.new(math.clamp(alpha, bump * 2, 1 - bump), back), - ColorSequenceKeypoint.new(1, back), - }) - end, BackgroundColor3, EnabledColor3, Alpha), - }), - } :: { Instance }, - }), - Knob, - } :: { Instance }, - }), - } :: { Instance }, - } - - config.EnabledColor3 = nil - config.HintBackgroundColor3 = nil - config.TextColor3 = nil - config.TickSound = nil - config.EnableSound = nil - config.DisableSound = nil - config.Input = nil - config.Minimum = nil - config.Maximum = nil - config.Increment = nil - config.Padding = nil - config.BubbleEnabled = nil - config.HintEnabled = nil - - for k, v in pairs(config) do - if parameters[k] == nil then - parameters[k] = v - end - end - - -- construct output instance - local Output: Frame = _fuse.new("Frame")(parameters :: any) :: Frame - - _Computed(function(dragging): nil - maid._dragStep = nil - maid._dragRelease = nil - if dragging then - maid._dragStep = UserInputService.InputChanged:Connect(function(inputObj: InputObject) - if inputObj.UserInputType == Enum.UserInputType.MouseMovement then - local pos = Vector2.new(inputObj.Position.X, inputObj.Position.Y) - local absPos = ButtonAbsolutePosition:Get() - local absSize = ButtonAbsoluteSize:Get() - local min = Minimum:Get() - local max = Maximum:Get() - Input:Set(min + (max - min) * math.clamp((pos.X - absPos.X) / absSize.X, 0, 1)) - end - end) - maid._dragRelease = UserInputService.InputEnded:Connect(function(inputObj: InputObject) - if inputObj.UserInputType == Enum.UserInputType.MouseButton1 then - Dragging:Set(false) - OnRelease:Fire(Value:Get()) - end - end) - else - local disabSound = DisableSound:Get() - if disabSound then - SoundService:PlayLocalSound(disabSound) - end - maid._currentBubble = nil - end - return nil - end, Dragging) - - maid:GiveTask(Value:Connect(function(cur) - Output:SetAttribute("Value", cur) - end)) - - Util.cleanUpPrep(maid, Output) - - return Output -end - -return function(maid: Maid?) - return function(params: SliderParameters): Slider - local inst = Constructor(params) - if maid then - maid:GiveTask(inst) - end - return inst - end -end diff --git a/src/SurfaceFrame/demo.story.lua b/src/SurfaceFrame/demo.story.lua deleted file mode 100644 index 7e820068..00000000 --- a/src/SurfaceFrame/demo.story.lua +++ /dev/null @@ -1,29 +0,0 @@ ---!strict -local SurfaceFrame = script.Parent -assert(SurfaceFrame) -local Package = SurfaceFrame.Parent -assert(Package) -local Packages = Package.Parent -assert(Packages) -local Maid = require(Packages:WaitForChild("Maid")) - -return function(coreGui: Frame) - local Maid = Maid.new() - local module = require(script.Parent) - - local part = Instance.new("Part") - part.Parent = workspace - Maid:GiveTask(part) - - Maid:GiveTask(module()({ - BackgroundColor3 = Color3.fromHSV(0.75, 1, 1), - Position = UDim2.fromScale(0.5, 0.5), - AnchorPoint = Vector2.new(0.5, 0.5), - Parent = coreGui, - Adornee = part, - Size = UDim2.fromOffset(50, 10), - })) - return function() - Maid:Destroy() - end -end diff --git a/src/SurfaceFrame/init.lua b/src/SurfaceFrame/init.lua deleted file mode 100644 index 958f589e..00000000 --- a/src/SurfaceFrame/init.lua +++ /dev/null @@ -1,103 +0,0 @@ ---!strict -local Package = script.Parent -assert(Package) -local Packages = Package.Parent -assert(Packages) - -local Util = require(Package:WaitForChild("Util")) - -local Types = require(Package:WaitForChild("Types")) - -local ColdFusion = require(Packages:WaitForChild("ColdFusion")) -type Fuse = ColdFusion.Fuse -type State = ColdFusion.State -type ValueState = ColdFusion.ValueState -type CanBeState = ColdFusion.CanBeState - -local Maid = require(Packages:WaitForChild("Maid")) -type Maid = Maid.Maid - -export type SurfaceFrameParameters = Types.FrameParameters & { - Face: CanBeState?, - Adornee: CanBeState?, - Parent: CanBeState?, - PixelsPerStud: CanBeState?, - LightInfluence: CanBeState?, - Brightness: CanBeState?, - AlwaysOnTop: CanBeState?, -} - -export type SurfaceFrame = Frame - -function Constructor(config: SurfaceFrameParameters): SurfaceFrame - -- init workspace - local maid = Maid.new() - local _fuse = ColdFusion.fuse(maid) - local _new = _fuse.new - local _bind = _fuse.bind - local _import = _fuse.import - local _Value = _fuse.Value - local _Computed = _fuse.Computed - - -- unload config states - local Name = _import(config.Name, script.Name) - local Face = _import(config.Face, Enum.NormalId.Left) - local Ad: any = _import(config.Adornee, nil) - local Adornee: State = Ad - local PixelsPerStud = _import(config.PixelsPerStud, 10) - local LightInfluence = _import(config.LightInfluence, 1) - local Brightness = _import(config.Brightness, 0) - local Par: any = _import(config.Parent, nil) - local Parent: State = Par - local AlwaysOnTop = _import(config.AlwaysOnTop, false) - - -- construct sub-instances - local SurfaceGui = _new("SurfaceGui")({ - Name = Name, - Adornee = Adornee, - Face = Face, - Parent = Parent, - SizingMode = Enum.SurfaceGuiSizingMode.PixelsPerStud, - PixelsPerStud = PixelsPerStud, - AlwaysOnTop = AlwaysOnTop, - Brightness = Brightness, - ClipsDescendants = true, - LightInfluence = LightInfluence, - }) - maid:GiveTask(SurfaceGui) - - -- assemble final parameters - local parameters: any = { - Name = Name, - Parent = SurfaceGui, - } - - config.Face = nil - config.Adornee = nil - config.PixelsPerStud = nil - config.LightInfluence = nil - config.Brightness = nil - config.AlwaysOnTop = nil - - for k, v in pairs(config) do - if parameters[k] == nil then - parameters[k] = v - end - end - - -- construct output instance - local Output: Frame = _new("Frame")(parameters) :: any - Util.cleanUpPrep(maid, Output) - - return Output -end - -return function(maid: Maid?) - return function(params: SurfaceFrameParameters): SurfaceFrame - local inst = Constructor(params) - if maid then - maid:GiveTask(inst) - end - return inst - end -end diff --git a/src/Switch/demo.story.lua b/src/Switch/demo.story.lua deleted file mode 100644 index e73e5174..00000000 --- a/src/Switch/demo.story.lua +++ /dev/null @@ -1,19 +0,0 @@ ---!strict - --- local ReplicatedStorage = game:GetService("ReplicatedStorage") -return function(coreGui) - local module = require(script.Parent) - local demo = { - Scale = 2, - EnabledColor3 = Color3.fromHSV(0.6, 1, 1), - Position = UDim2.fromScale(0.5, 0.5), - AnchorPoint = Vector2.new(0.5, 0.5), - Parent = coreGui, - -- EnableSound = ReplicatedStorage.Library.Sounds.UI.Button.Confirm["1"]:Clone(), - -- DisableSound = ReplicatedStorage.Library.Sounds.UI.Button.Cancel:Clone(), - } - local object = module()(demo :: any) - return function() - object:Destroy() - end -end diff --git a/src/Switch/init.lua b/src/Switch/init.lua deleted file mode 100644 index 34699c99..00000000 --- a/src/Switch/init.lua +++ /dev/null @@ -1,248 +0,0 @@ ---!strict -local SoundService = game:GetService("SoundService") - -local Package = script.Parent -assert(Package) -local Packages = Package.Parent -assert(Packages) - -local Util = require(Package:WaitForChild("Util")) - -local Types = require(Package:WaitForChild("Types")) - -local ColdFusion = require(Packages:WaitForChild("ColdFusion")) -type Fuse = ColdFusion.Fuse -type State = ColdFusion.State -type ValueState = ColdFusion.ValueState -type CanBeState = ColdFusion.CanBeState - -local Maid = require(Packages:WaitForChild("Maid")) -type Maid = Maid.Maid - -local Signal = require(Packages:WaitForChild("Signal")) - -local Bubble = require(Package:WaitForChild("Bubble")) - -export type SwitchParameters = Types.FrameParameters & { - Scale: CanBeState?, - EnabledColor3: CanBeState?, - Value: ValueState, - EnableSound: CanBeState?, - DisableSound: CanBeState?, - BubbleEnabled: CanBeState?, -} - -export type Switch = Frame - -function Constructor(config: SwitchParameters): Switch - -- init workspace - local maid = Maid.new() - local _fuse = ColdFusion.fuse(maid) - local _new = _fuse.new - local _bind = _fuse.bind - local _import = _fuse.import - local _Value = _fuse.Value - local _Computed = _fuse.Computed - - -- unload config states - local Name = _import(config.Name, script.Name) - local Scale = _import(config.Scale, 1) - local BackgroundColor3 = _import(config.BackgroundColor3, Color3.fromHSV(0, 0, 0.9)) - local EnabledColor3 = _import(config.EnabledColor3, Color3.fromHSV(0.6, 1, 1)) - local Value = config.Value :: any - local ES: any = _import(config.EnableSound, nil) - local EnableSound: State = ES - local DS: any = _import(config.DisableSound, nil) - local DisableSound: State = DS - local BubbleEnabled = _Value(if typeof(config.BubbleEnabled) == "boolean" then config.BubbleEnabled elseif typeof(config.BubbleEnabled) == "table" then config.BubbleEnabled:Get() else false) - - -- construct signals - local Activated = Signal.new() - maid:GiveTask(Activated) - - -- init internal states - local Padding = _Computed(function(scale) - return math.round(6 * scale) - end, Scale) - local Width = _Computed(function(scale: number) - return math.round(scale * 20) - end, Scale) - local ActiveColor3 = _Computed(function(val: boolean, back: Color3, col: Color3): Color3 - if val then - return col - else - return back - end - end, Value, BackgroundColor3, EnabledColor3) - - -- bind states - maid:GiveTask(Activated:Connect(function() - if Value:Get() == true then - local clickSound = EnableSound:Get() - if clickSound then - SoundService:PlayLocalSound(clickSound) - end - else - local clickSound = DisableSound:Get() - if clickSound then - SoundService:PlayLocalSound(clickSound) - end - end - if Value.Set then - Value:Set(not Value:Get()) - end - if BubbleEnabled:Get() == false then - BubbleEnabled:Set(true) - task.wait(0.2) - BubbleEnabled:Set(false) - end - end)) - - -- construct sub-instances - local Knob = _new("Frame")({ - Name = "Knob", - ZIndex = 2, - Position = _Computed(function(val) - if val then - return UDim2.fromScale(1, 0.5) - else - return UDim2.fromScale(0, 0.5) - end - end, Value):Tween(), - AnchorPoint = Vector2.new(0.5, 0.5), - Size = UDim2.fromScale(1, 1), - SizeConstraint = Enum.SizeConstraint.RelativeYY, - BackgroundTransparency = 1, - Children = { - _new("Frame")({ - Name = "Frame", - ZIndex = 2, - Position = UDim2.fromScale(0.5, 0.5), - AnchorPoint = Vector2.new(0.5, 0.5), - BackgroundColor3 = ActiveColor3:Tween(), - Size = _Computed(function(width: number, padding: number) - return UDim2.fromOffset(width - padding, width - padding) - end, Width, Padding), - BorderSizePixel = 0, - Children = { - _new("UICorner")({ - CornerRadius = _Computed(function(padding) - return UDim.new(1, 0) - end, Padding), - }), - _new("UIStroke")({ - ApplyStrokeMode = Enum.ApplyStrokeMode.Border, - Thickness = _Computed(function(padding) - return 1 --math.round(padding*0.25) - end, Padding), - Transparency = 0.8, - }), - } :: { Instance }, - }), - } :: { Instance }, - }) - - -- assemble final parameters - local parameters: any = { - Name = Name, - Size = _Computed(function(width: number) - return UDim2.fromOffset(width * 2, width * 2) - end, Width), - BackgroundTransparency = 1, - Children = { - _new("ImageButton")({ - Name = "Button", - ZIndex = 3, - BackgroundTransparency = 1, - ImageTransparency = 1, - Position = UDim2.fromScale(0.5, 0.5), - Size = UDim2.fromScale(1, 1), - AnchorPoint = Vector2.new(0.5, 0.5), - Events = { - Activated = function() - Activated:Fire() - if BubbleEnabled:Get() then - local bubble = Bubble(maid)({ - Parent = Knob, - -- BackgroundColor3 = ActiveColor3, - -- BackgroundTransparency = 0.6, - }) - - local fireFunction = bubble:FindFirstChild("Fire") - assert(fireFunction ~= nil and fireFunction:IsA("BindableFunction")) - fireFunction:Invoke() - end - end, - }, - }), - _new("Frame")({ - Name = "Frame", - ZIndex = 1, - Size = _Computed(function(width: number, padding: number) - local w = width - padding * 2 - return UDim2.new(0, 2 * w, 1, 0) - end, Width, Padding), - Position = UDim2.fromScale(0.5, 0.5), - AnchorPoint = Vector2.new(0.5, 0.5), - BackgroundTransparency = 1, - Children = { - _new("Frame")({ - Name = "Track", - ZIndex = 1, - BackgroundTransparency = 0.5, - Position = UDim2.fromScale(0.5, 0.5), - AnchorPoint = Vector2.new(0.5, 0.5), - Size = _Computed(function(width: number, padding: number) - local w = math.round(width - padding * 1.75) - return UDim2.new(1, 0, 0, w) - end, Width, Padding), - BackgroundColor3 = _Computed(function(val, col) - local h, _s, _v = col:ToHSV() - if val then - return Color3.fromHSV(h, 0.5, 1) - else - return Color3.fromHSV(h, 0, 1) - end - end, Value, EnabledColor3):Tween(), - Children = { - _new("UICorner")({ - CornerRadius = UDim.new(0.5, 0), - }), - } :: { Instance }, - }), - Knob, - } :: { Instance }, - }), - } :: { Instance }, - } - - config.Scale = nil - config.EnabledColor3 = nil - config.Value = nil :: any - config.EnableSound = nil - config.DisableSound = nil - config.BubbleEnabled = nil - - for k, v in pairs(config) do - if parameters[k] == nil then - parameters[k] = v - end - end - - -- construct output instance - local Output: Frame = _new("Frame")(parameters) :: any - Util.cleanUpPrep(maid, Output) - Util.bindSignal(Output, maid, "Activated", Activated) - - return Output -end - -return function(maid: Maid?) - return function(params: SwitchParameters): Switch - local inst = Constructor(params) - if maid then - maid:GiveTask(inst) - end - return inst - end -end diff --git a/src/Test/Source.cfusion.luau b/src/Test/Source.cfusion.luau new file mode 100644 index 00000000..e69de29b diff --git a/src/Test/init.luau b/src/Test/init.luau new file mode 100644 index 00000000..6f70e623 --- /dev/null +++ b/src/Test/init.luau @@ -0,0 +1,12 @@ +--!strict +local _Package = script +local _Packages = _Package.Parent +-- Services +-- Packages +-- Modules +-- Types +-- Constants +-- Variables +-- References +-- Private Functions +-- Class \ No newline at end of file diff --git a/src/TextField/demo.story.lua b/src/TextField/demo.story.lua deleted file mode 100644 index 0ab94353..00000000 --- a/src/TextField/demo.story.lua +++ /dev/null @@ -1,27 +0,0 @@ ---!strict - -return function(coreGui) - local module = require(script.Parent) - local demo: any = { - -- Text = "Label", - -- TextSize = 18, - -- TextColor3 = Color3.fromHSV(1,0,0.2), - -- BackgroundColor3 = Color3.fromHSV(1,0,0.9), - -- HoverBackgroundColor3 = Color3.fromHSV(1,0,0.8), - -- FocusedBackgroundColor3 = Color3.fromHSV(1,0,0.7), - -- BorderColor3 = Color3.fromHSV(0.7,0.7,1), - -- CharacterLimit = 20, - -- LowerText = "Test 123 is bad", - -- MaintainLowerSpacing = true, - -- BackgroundTransparency = 1, - -- LeftIcon = "home", - -- RightIcon = "settings", - -- Position = UDim2.fromScale(0.5,0.5), - -- AnchorPoint = Vector2.new(0.5,0.5), - Parent = coreGui, - } - local object = module()(demo) - return function() - object:Destroy() - end -end diff --git a/src/TextField/init.lua b/src/TextField/init.lua deleted file mode 100644 index f0da99f2..00000000 --- a/src/TextField/init.lua +++ /dev/null @@ -1,504 +0,0 @@ ---!strict -local Package = script.Parent -assert(Package) -local Packages = Package.Parent -assert(Packages) - -local RunService = game:GetService("RunService") - -local Util = require(Package:WaitForChild("Util")) -local Types = require(Package:WaitForChild("Types")) - -local ColdFusion = require(Packages:WaitForChild("ColdFusion")) -type Fuse = ColdFusion.Fuse -type State = ColdFusion.State -type ValueState = ColdFusion.ValueState -type CanBeState = ColdFusion.CanBeState - -local Maid = require(Packages:WaitForChild("Maid")) -type Maid = Maid.Maid - -local Signal = require(Packages:WaitForChild("Signal")) - -local IconLabel = require(Package:WaitForChild("IconLabel")) - -export type TextFieldParameters = Types.TextBoxParameters & { - Value: ValueState, - LowerText: CanBeState?, - LowerTextColor3: CanBeState?, - Width: CanBeState?, - CornerRadius: CanBeState?, - CharacterLimit: CanBeState?, - MaintainLowerSpacing: CanBeState?, - FocusedBackgroundColor3: CanBeState?, - HoverBackgroundColor3: CanBeState?, - IconScale: CanBeState?, - LeftIcon: CanBeState?, - RightIcon: CanBeState?, -} - -export type TextField = Frame - -function Constructor(config: TextFieldParameters): TextField - -- init workspace - local maid = Maid.new() - local _fuse = ColdFusion.fuse(maid) - local _new = _fuse.new - local _bind = _fuse.bind - local _import = _fuse.import - local _Value = _fuse.Value - local _Computed = _fuse.Computed - - -- unload config states - local Name = _import(config.Name, script.Name) - local Value = config.Value - local TextSize = _import(config.TextSize, 14) - local Parent = _import(config.Parent, nil) - local LowerText: State = _import(config.LowerText, "") - local LowerTextColor3: State = _import(config.LowerTextColor3, Color3.new(1, 0, 0)) - local Width = _import(config.Width, UDim.new(0, 250)) - local CornerRadius = _import(config.CornerRadius, UDim.new(0, 3)) - local CharacterLimit: State = _import(config.CharacterLimit, nil :: number?) - local BackgroundTransparency = _import(config.BackgroundTransparency, 0) - local ClearTextOnFocus = _import(config.ClearTextOnFocus, false) - local TextColor3 = _import(config.TextColor3, Color3.new(1, 1, 1)) - local TextTransparency = _import(config.TextTransparency, 0) - local Text = _import(config.Text, "Text") - local FontFace = _import(config.Font, Font.fromEnum(Enum.Font.Gotham)) - local MaintainLowerSpacing = _import(config.MaintainLowerSpacing, false) - local BackgroundColor3 = _import(config.BackgroundColor3, Color3.fromHSV(0, 0, 0.2)) - local FocusedBackgroundColor3 = _import(config.FocusedBackgroundColor3, Color3.fromHSV(0, 0, 0.4)) - local HoverBackgroundColor3: State = _import( - config.HoverBackgroundColor3, - _Computed(function(sCol: Color3, bCol: Color3): Color3 - local h1, s1, v1 = sCol:ToHSV() - local _, s2, v2 = bCol:ToHSV() - return Color3.fromHSV(h1, s1 + (s2 - s1) * 0.5, v1 + (v2 - v1) * 0.5) - end, FocusedBackgroundColor3, BackgroundColor3) - ) - local BorderSizePixel = _import(config.BorderSizePixel, 2) - local BorderColor3 = _import(config.BorderColor3, Color3.fromHSV(0.6, 1, 1)) - local IconScale = _import(config.IconScale, 1.25) - local LeftIcon: State = _import(config.LeftIcon, nil :: string?) - local RightIcon: State = _import(config.RightIcon, nil :: string?) - - -- construct signals - local OnInputChanged = Signal.new() - maid:GiveTask(OnInputChanged) - local OnInputComplete = Signal.new() - maid:GiveTask(OnInputComplete) - - -- init internal states - local TextBoxValue: ValueState = _Value(Value:Get()) - local IsFocused: ValueState = _Value(false) - local CursorPosition = _Value(0) - local TextBox = _Value(nil :: TextBox?) - local IsHovering: ValueState = _Value(false) - local IconSize = _Computed(function(textSize: number, scale: number) - return math.round(textSize * scale) - end, TextSize, IconScale) - local LeftOffset = _Computed(function(leftIcon: string?, iconSize: number, textSize: number) - if leftIcon then - return iconSize + textSize - else - return 0 - end - end, LeftIcon, IconSize, TextSize) - local RightOffset = _Computed(function(rightIcon: string?, iconSize: number, textSize: number) - if rightIcon then - return iconSize + textSize - else - return 0 - end - end, RightIcon, IconSize, TextSize) - local CenterOffset = _Computed(function(leftOff: number, rightOff: number) - return leftOff - rightOff - end, LeftOffset, RightOffset) - local IsEmpty = _Computed(function(input, focused) - return input == "" and not focused - end, Value, IsFocused) - local LowerTextSize = _Computed(function(textSize: number, isEmpty) - return textSize * 0.75 - end, TextSize, IsEmpty) - local LowerTextFrameHeight = _Computed(function(txtSize: number) - return UDim.new(0, txtSize) - end, LowerTextSize) - local CharacterCount = _Computed(function(input: string) - if not input then - return 0 - end - assert(input ~= nil) - return string.len(input) - end, Value) - - -- bind states - maid:GiveTask(Value:Connect(function(cur) - OnInputChanged:Fire(cur) - end)) - maid:GiveTask(IsFocused:Connect(function(v) - if v == false then - OnInputComplete:Fire(Value:Get()) - end - end)) - - -- constructing instances - local textBox = _new("TextBox")({ - BackgroundTransparency = 1, - Text = Value, - ClearTextOnFocus = ClearTextOnFocus, - AnchorPoint = Vector2.new(0.5, 1), - Position = _Computed(function(txtSize, cOff) - return UDim2.new(UDim.new(0.5, 0.5 * cOff), UDim.new(1, -txtSize * 0.5)) - end, TextSize, CenterOffset), - TextColor3 = TextColor3, - TextSize = TextSize, - FontFace = FontFace, - MultiLine = false, - PlaceholderText = "", - RichText = false, - TextTruncate = Enum.TextTruncate.AtEnd, - TextXAlignment = Enum.TextXAlignment.Left, - TextYAlignment = Enum.TextYAlignment.Center, - TextTransparency = TextTransparency, - Size = _Computed(function(textSize, lOff, rOff) - return UDim2.new(UDim.new(1, -textSize * 1.25 - lOff - rOff), UDim.new(0, textSize)) - end, TextSize, LeftOffset, RightOffset), - Events = { - Focused = function() - local txtBox = TextBox:Get() - if not txtBox then - return - end - assert(txtBox ~= nil) - IsFocused:Set(txtBox:IsFocused()) - end, - FocusLost = function() - local txtBox = TextBox:Get() - if not txtBox then - return - end - assert(txtBox ~= nil) - Value:Set(TextBoxValue:Get()) - IsFocused:Set(txtBox:IsFocused()) - end, - }, - } :: { [any]: any }) :: TextBox - TextBox:Set(textBox) - maid:GiveTask(RunService.RenderStepped:Connect(function() - TextBoxValue:Set(textBox.Text) - CursorPosition:Set(textBox.CursorPosition) - end)) - - local Label = _new("TextLabel")({ - Name = "Label", - BackgroundTransparency = 1, - Text = Text, - FontFace = FontFace, - TextTransparency = TextTransparency, - TextXAlignment = Enum.TextXAlignment.Left, - TextYAlignment = Enum.TextYAlignment.Center, - TextSize = _Computed(function(textSize: number, isEmpty) - if isEmpty then - return textSize * 1 - else - return textSize * 0.75 - end - end, TextSize, IsEmpty):Tween(), - TextColor3 = _Computed(function(col, textCol, isEmpty) - if not isEmpty then - return col - else - return textCol - end - end, BorderColor3, TextColor3, IsEmpty):Tween(), - Size = _Computed(function(textSize, leftOffset, rightOffset) - return UDim2.new(UDim.new(1, -textSize * 2 - leftOffset - rightOffset), UDim.new(0, textSize * 0.75)) - end, TextSize, LeftOffset, RightOffset):Tween(), - Position = _Computed(function(isEmpty, textSize: number, lOff: number, rOff: number, cOff: number) - if not isEmpty then - return UDim2.new(UDim.new(0, textSize * 0.75 + lOff), UDim.new(0, textSize * 0.5)) - else - return UDim2.new(UDim.new(0.5, (lOff - rOff) * 0.5), UDim.new(0.5, 0)) - end - end, IsEmpty, TextSize, LeftOffset, RightOffset, CenterOffset):Tween(), - AnchorPoint = _Computed(function(isEmpty): Vector2 - if not isEmpty then - return Vector2.new(0, 0) - else - return Vector2.new(0.5, 0.5) - end - end, IsEmpty):Tween(), - }) - - local Frame = _new("Frame")({ - Name = "Container", - BackgroundTransparency = BackgroundTransparency, - BackgroundColor3 = _Computed(function(isFocused: boolean, isHovering: boolean, backColor: Color3, focusColor: Color3, hoverColor: Color3): Color3 - if isFocused then - return focusColor - elseif isHovering then - return hoverColor - else - return backColor - end - end, IsFocused, IsHovering, BackgroundColor3, FocusedBackgroundColor3, HoverBackgroundColor3), - Size = _Computed(function(textSize: number, width) - return UDim2.new(width, UDim.new(0, textSize * 3)) - end, TextSize, Width), - Children = { - _new("Frame")({ - AnchorPoint = Vector2.new(0.5, 1), - Size = _Computed(function(pix: number, focused) - if focused then - return UDim2.new(UDim.new(1, 0), UDim.new(0, pix)) - else - return UDim2.new(UDim.new(1, 0), UDim.new(0, pix * 0.5)) - end - end, BorderSizePixel, IsFocused):Tween(), - Position = UDim2.fromScale(0.5, 1), - BackgroundTransparency = _Computed(function(trans) - if trans == 0 then - return 0 - else - return 1 - end - end, BackgroundTransparency):Tween(), - BackgroundColor3 = _Computed(function(isFocused: boolean, borderCol: Color3, textCol: Color3) - if isFocused then - return borderCol - else - return textCol - end - end, IsFocused, BorderColor3, TextColor3):Tween(), - }), - _new("UIStroke")({ - ApplyStrokeMode = Enum.ApplyStrokeMode.Border, - Thickness = BorderSizePixel, - Color = _Computed(function(bCol: Color3, tCol: Color3, isFoc: boolean) - if isFoc then - return bCol - else - return tCol - end - end, BorderColor3, TextColor3, IsFocused):Tween(), - Transparency = _Computed(function(trans: number) - if trans == 0 then - return 1 - else - return 0 - end - end, BackgroundTransparency):Tween(), - }), - _new("UICorner")({ - CornerRadius = CornerRadius, - }), - _new("TextButton")({ - Text = "", - TextTransparency = 1, - AnchorPoint = Vector2.new(0.5, 0.5), - Position = UDim2.fromScale(0.5, 0.5), - Size = UDim2.fromScale(1, 1), - ZIndex = 10, - BackgroundTransparency = 1, - Events = { - Activated = function() - local txtBox = TextBox:Get() - if not txtBox then - return - end - assert(txtBox ~= nil) - if txtBox:IsFocused() then - txtBox:ReleaseFocus() - else - txtBox:CaptureFocus() - end - end, - InputChanged = function() - IsHovering:Set(true) - end, - MouseLeave = function() - IsHovering:Set(false) - end, - }, - }), - IconLabel(maid)({ - Name = "Right", - IconTransparency = 0, - IconColor3 = TextColor3, - Icon = RightIcon :: any, - Position = _Computed(function(txtSize): UDim2 - return UDim2.new(UDim.new(1, -txtSize), UDim.new(0.5, 0)) - end, TextSize), - Size = _Computed(function(iconSize): UDim2 - return UDim2.fromOffset(iconSize, iconSize) - end, IconSize), - AnchorPoint = Vector2.new(1, 0.5), - }) :: any, - IconLabel(maid)({ - Name = "Left", - Position = _Computed(function(txtSize: number) - return UDim2.new(UDim.new(0, txtSize), UDim.new(0.5, 0)) - end, TextSize), - Size = _Computed(function(iconSize) - return UDim2.fromOffset(iconSize, iconSize) - end, IconSize), - AnchorPoint = Vector2.new(0, 0.5), - IconTransparency = 0, - IconColor3 = TextColor3, - Icon = LeftIcon :: any, - }), - TextBox, - Label, - } :: { any }, - }) - - local CharLimitLabel = _new("TextLabel")({ - Name = "CharLimit", - AnchorPoint = Vector2.new(1, 0), - Position = UDim2.fromScale(1, 0), - AutomaticSize = Enum.AutomaticSize.XY, - BackgroundTransparency = 1, - Text = _Computed(function(lim: number?, count: number) - if lim and count then - return count .. " / " .. lim - else - return "" - end - end, CharacterLimit, CharacterCount), - FontFace = FontFace, - TextTransparency = TextTransparency, - TextXAlignment = Enum.TextXAlignment.Left, - TextYAlignment = Enum.TextYAlignment.Center, - TextSize = LowerTextSize, - TextColor3 = _Computed(function(col: Color3, textCol: Color3, isEmpty: boolean) - if not isEmpty then - return col - else - return textCol - end - end, BorderColor3, TextColor3, IsEmpty), - }) - - local LowerTextLabel = _new("TextLabel")({ - Name = "TextLabel", - AnchorPoint = Vector2.new(0, 0), - Position = UDim2.fromScale(0, 0), - AutomaticSize = Enum.AutomaticSize.XY, - BackgroundTransparency = 1, - Text = LowerText, - FontFace = FontFace, - TextTransparency = TextTransparency, - TextXAlignment = Enum.TextXAlignment.Left, - TextYAlignment = Enum.TextYAlignment.Center, - TextSize = LowerTextSize, - TextColor3 = LowerTextColor3, - }) - - local LowerTextFrame = _new("Frame")({ - Name = "LowerTextFrame", - BackgroundTransparency = 1, - AutomaticSize = Enum.AutomaticSize.XY, - LayoutOrder = 2, - Size = _Computed(function(width, height) - return UDim2.new(width, height) - end, Width, LowerTextFrameHeight), - Visible = _Computed(function(charLim, lowerText, lowerSpacing) - local isFilled = not (charLim == nil and (lowerText == nil or lowerText == "")) - return lowerSpacing == true or isFilled - end, CharacterLimit, LowerText, MaintainLowerSpacing), - Children = { - CharLimitLabel, - LowerTextLabel, - } :: { Instance }, - }) - - -- assemble final parameters - local parameters: any = { - Name = Name, - AutomaticSize = Enum.AutomaticSize.Y, - BackgroundTransparency = 1, - Size = _Computed(function(width) - return UDim2.new(width, UDim.new(0, 0)) - end, Width), - Parent = Parent, - Children = { - _new("UIListLayout")({ - FillDirection = Enum.FillDirection.Vertical, - HorizontalAlignment = Enum.HorizontalAlignment.Center, - SortOrder = Enum.SortOrder.LayoutOrder, - VerticalAlignment = Enum.VerticalAlignment.Top, - Padding = _Computed(function(txtSize: number) - return UDim.new(0, txtSize * 0.25) - end, TextSize), - }), - Frame, - LowerTextFrame, - } :: { Instance }, - } - - config.LowerText = nil - config.LowerTextColor3 = nil - config.TextColor3 = nil - config.TextTransparency = nil - config.TextStrokeColor3 = nil - config.TextScaled = nil - config.FontFace = nil - config.Text = nil - config.TextSize = nil - config.Width = nil - config.CornerRadius = nil - config.CharacterLimit = nil - config.MaintainLowerSpacing = nil - config.FocusedBackgroundColor3 = nil - config.HoverBackgroundColor3 = nil - config.ClearTextOnFocus = nil - config.IconScale = nil - config.LeftIcon = nil - config.Value = nil :: any - config.RightIcon = nil - - for k, v in pairs(config) do - if parameters[k] == nil then - parameters[k] = v - end - end - - -- construct output instance - local Output: Frame = _new("Frame")(parameters) :: any - Util.cleanUpPrep(maid, Output) - - -- bind functions to output - local _setInput = Util.bindFunction(Output, maid, "SetInput", function(txt, cursorOffset: number?) - Value:Set(txt) - -- assert(typeof(TextBox.CursorPosition) == "number") - CursorPosition:Set(cursorOffset or CursorPosition:Get() or 0) - return nil - end) - local _clear = Util.bindFunction(Output, maid, "Clear", function() - Value:Set("") - CursorPosition:Set(1) - return nil - end) - _Computed(function(input: string, count: number, lim: number?): nil - if lim and input then - if lim < count then - _setInput:Invoke(string.sub(input, 1, lim)) - end - end - return nil - end, Value, CharacterCount, CharacterLimit) - Util.bindSignal(Output, maid, "OnInputChanged", OnInputChanged) - Util.bindSignal(Output, maid, "OnInputComplete", OnInputComplete) - - return Output -end - -return function(maid: Maid?) - return function(params: TextFieldParameters): TextField - local inst = Constructor(params) - if maid then - maid:GiveTask(inst) - end - return inst - end -end diff --git a/src/TextLabel/demo.story.lua b/src/TextLabel/demo.story.lua deleted file mode 100644 index 563bf2ac..00000000 --- a/src/TextLabel/demo.story.lua +++ /dev/null @@ -1,19 +0,0 @@ ---!strict - -return function(coreGui) - local module = require(script.Parent) - local demo = { - Text = "Button ~~Yeah~~", - TextColor3 = Color3.new(1, 1, 1), - BackgroundTransparency = 1, - Position = UDim2.fromScale(0.5, 0.5), - AnchorPoint = Vector2.new(0.5, 0.5), - Parent = coreGui, - LeftIcon = "star", - RightIcon = "star", - } - local object = module()(demo) - return function() - object:Destroy() - end -end diff --git a/src/TextLabel/init.lua b/src/TextLabel/init.lua deleted file mode 100644 index 67b8034b..00000000 --- a/src/TextLabel/init.lua +++ /dev/null @@ -1,180 +0,0 @@ ---!strict -local Package = script.Parent -assert(Package) -local Packages = Package.Parent -assert(Packages) - -local Util = require(Package:WaitForChild("Util")) - -local Types = require(Package:WaitForChild("Types")) - -local ColdFusion: Fuse = require(Packages:WaitForChild("ColdFusion")) -type Fuse = ColdFusion.Fuse -type State = ColdFusion.State -type ValueState = ColdFusion.ValueState -type CanBeState = ColdFusion.CanBeState - -local Maid = require(Packages:WaitForChild("Maid")) -type Maid = Maid.Maid - -local Format = require(Packages:WaitForChild("Format")) - -local Icon = require(Package:WaitForChild("IconLabel")) - -export type TextLabelParameters = Types.FrameParameters & { - Padding: CanBeState?, - TextSize: CanBeState?, - TextColor3: CanBeState?, - TextTransparency: CanBeState?, - TextXAlignment: CanBeState?, - TextYAlignment: CanBeState?, - Text: CanBeState?, - Font: CanBeState?, - IconScale: CanBeState?, - LeftIcon: CanBeState?, - RightIcon: CanBeState?, -} - -export type TextLabel = Frame - -function Constructor(config: TextLabelParameters): TextLabel - -- init workspace - local maid = Maid.new() - local _fuse = ColdFusion.fuse(maid) - local _new = _fuse.new - local _bind = _fuse.bind - local _import = _fuse.import - local _Value = _fuse.Value - local _Computed = _fuse.Computed - - -- unload config states - local Padding = _import(config.Padding, UDim.new(0, 2)) - local TextSize = _import(config.TextSize, 14) - local TextColor3 = _import(config.TextColor3, Color3.new(1, 1, 1)) - local TextTransparency = _import(config.TextTransparency, 0) - local TextXAlignment = _import(config.TextXAlignment, Enum.TextXAlignment.Center) - local TextYAlignment = _import(config.TextYAlignment, Enum.TextYAlignment.Center) - local Text = _import(config.Text, "") - local FontFace = _import(config.Font, Font.fromEnum(Enum.Font.Gotham)) - local IconScale = _import(config.IconScale, 1.25) - local LeftIcon = _import(config.LeftIcon, "") - local RightIcon = _import(config.RightIcon, "") - - -- init internal states - local IconSize = _Computed(function(textSize: number, scale: number) - local size = math.round(textSize * scale) - return UDim2.fromOffset(size, size) - end, TextSize, IconScale) - - -- assemble final parameters - local parameters: any = { - Name = _import(config.Name, script.Name), - AutomaticSize = Enum.AutomaticSize.XY, - BackgroundTransparency = 1, - Size = UDim2.fromScale(0, 0), - Children = { - _new("UIListLayout")({ - Name = "Test", - FillDirection = Enum.FillDirection.Horizontal, - HorizontalAlignment = _Computed(function(xAlign: Enum.TextXAlignment) - if xAlign == Enum.TextXAlignment.Center then - return Enum.HorizontalAlignment.Center - elseif xAlign == Enum.TextXAlignment.Left then - return Enum.HorizontalAlignment.Left - elseif xAlign == Enum.TextXAlignment.Right then - return Enum.HorizontalAlignment.Right - end - error("HorizontalAlignment Error") - end, TextXAlignment), - SortOrder = Enum.SortOrder.LayoutOrder, - VerticalAlignment = _Computed(function(yAlign) - if yAlign == Enum.TextYAlignment.Center then - return Enum.VerticalAlignment.Center - elseif yAlign == Enum.TextYAlignment.Top then - return Enum.VerticalAlignment.Top - elseif yAlign == Enum.TextYAlignment.Bottom then - return Enum.VerticalAlignment.Bottom - end - error("VerticalAlignment Error") - end, TextYAlignment), - Padding = Padding, - }), - _new("TextLabel")({ - RichText = true, - TextColor3 = TextColor3, - TextSize = TextSize, - Visible = _Computed(function(txt: string) - if not txt or string.len(txt) == 0 then - return false - else - return true - end - end, Text), - FontFace = FontFace, - LayoutOrder = 2, - TextTransparency = TextTransparency, - Text = _Computed(function(txt: string) - return Format(txt) - end, Text), - BackgroundTransparency = 1, - AutomaticSize = Enum.AutomaticSize.XY, - }), - Icon(maid)({ - Size = IconSize, - LayoutOrder = 1, - Visible = _Computed(function(icon) - return icon ~= nil and icon ~= "" - end, LeftIcon), - Name = "LeftIcon", - Icon = LeftIcon, - IconColor3 = TextColor3, - IconTransparency = TextTransparency, - }), - Icon(maid)({ - Size = IconSize, - LayoutOrder = 3, - Visible = _Computed(function(icon) - return icon ~= nil and icon ~= "" - end, RightIcon), - Name = "RightIcon", - Icon = RightIcon, - IconColor3 = TextColor3, - IconTransparency = TextTransparency, - }), - } :: { Instance }, - } - - config.Padding = nil - config.TextSize = nil - config.TextColor3 = nil - config.TextTransparency = nil - config.TextXAlignment = nil - config.TextYAlignment = nil - config.Text = nil - config.FontFace = nil - config.IconScale = nil - config.LeftIcon = nil - config.RightIcon = nil - - for k, v in pairs(config) do - if parameters[k] == nil then - parameters[k] = v - end - end - - -- construct output instance - local Output = _new("Frame")(parameters) - Util.cleanUpPrep(maid, Output) - - return Output :: Frame -end - -return function(maid: Maid?) - return function(...): TextLabel - local inst = Constructor(...) - if maid then - maid:GiveTask(inst) - end - return inst - end -end diff --git a/src/Types.lua b/src/Types.lua deleted file mode 100644 index 8324ab89..00000000 --- a/src/Types.lua +++ /dev/null @@ -1,224 +0,0 @@ ---!strict -local Package = script.Parent -assert(Package) -local Packages = Package.Parent -assert(Packages) - -local ColdFusion = require(Packages:WaitForChild("ColdFusion")) - -type Fuse = ColdFusion.Fuse -type State = { - Get: (any) -> T, -} -type ValueState = State & { - Set: (any, T) -> nil, -} - -local Maid = require(Packages:WaitForChild("Maid")) -type Maid = Maid.Maid - -export type CanBeState = State | T - -export type InstanceParameters = any --- { --- Archivable: CanBeState?, --- Name: CanBeState?, --- Parent: CanBeState?, --- Children: { Instance }?, --- } - -export type GuiBase2dParameters = any --- InstanceParameters & { --- AbsolutePosition: CanBeState?, --- AbsoluteRotiation: CanBeState?, --- AbsoluteSize: CanBeState?, --- AutoLocalize: CanBeState?, --- RootLocalizationTable: CanBeState?, --- SelectionGroup: CanBeState?, --- } - -export type LayerCollectorParameters = any --- GuiBase2dParameters & { --- Enabled: CanBeState?, --- ResetOnSpawn: CanBeState?, --- ZIndexBehavior: CanBeState?, --- } - -export type GuiObjectParameters = any --- GuiBase2dParameters & { --- Active: CanBeState?, --- AnchorPoint: CanBeState?, --- AutomaticSize: CanBeState?, --- BackgroundColor3: CanBeState?, --- BackgroundTransparency: CanBeState?, --- BorderColor3: CanBeState?, --- BorderMode: CanBeState?, --- BorderSizePixel: CanBeState?, --- ClipsDescendants: CanBeState?, --- LayoutOrder: CanBeState?, --- NextSelectionDown: CanBeState?, --- NextSelectionLeft: CanBeState?, --- NextSelectionRight: CanBeState?, --- NextSelectionUp: CanBeState?, --- Position: CanBeState?, --- Rotation: CanBeState?, --- Selectable: CanBeState?, --- SelectionImageObject: CanBeState?, --- SelectionOrder: CanBeState?, --- Size: CanBeState?, --- SizeConstraint: CanBeState?, --- Visible: CanBeState?, --- ZIndex: CanBeState?, --- } - -export type FrameParameters = any --- GuiObjectParameters - -export type GuiButtonParameters = any --- GuiObjectParameters & { --- AutoButtonColor: CanBeState?, --- Modal: CanBeState?, --- Selected: CanBeState?, --- Style: CanBeState?, --- } - -type ImageDisplay = any --- { --- Image: CanBeState?, --- ImageColor3: CanBeState?, --- ImageRectOffset: CanBeState?, --- ImageRectSize: CanBeState?, --- ImageTransparency: CanBeState?, --- IsLoaded: CanBeState?, --- PressedImage: CanBeState?, --- ResampleMode: CanBeState?, --- ScaleType: CanBeState?, --- SliceCenter: CanBeState?, --- SliceScale: CanBeState?, --- TileSize: CanBeState?, --- } - -type TextDisplay = any --- { --- Font: CanBeState?, --- FontFace: CanBeState?, --- LineHeight: CanBeState?, --- MaxVisibleGraphemes: CanBeState?, --- RichText: CanBeState?, --- Text: CanBeState?, --- TextBounds: CanBeState?, --- TextColor3: CanBeState?, --- TextFits: CanBeState?, --- TextScaled: CanBeState?, --- TextSize: CanBeState?, --- TextStrokeColor3: CanBeState?, --- TextStrokeTransparency: CanBeState?, --- TextTransparency: CanBeState?, --- TextTruncate: CanBeState?, --- TextWrapped: CanBeState?, --- TextXAlignment: CanBeState?, --- TextYAlignment: CanBeState?, --- } - -export type TextButtonParameters = any --- GuiButtonParameters & TextDisplay & { --- ContentText: CanBeState?, --- } - -export type ImageButtonParameters = any --- GuiButtonParameters & ImageDisplay & { --- HoverImage: CanBeState?, --- } - -export type ImageLabelParameters = any --- GuiObjectParameters & ImageDisplay -export type TextLabelParameters = any --- GuiObjectParameters & TextDisplay - -export type ScrollingFrameParameters = any --- GuiObjectParameters & { --- AbsoluteCanvasSize: CanBeState?, --- AbsoluteWindowSize: CanBeState?, --- AutomaticCanvasSize: CanBeState?, --- BottomImage: CanBeState?, --- CanvasPosition: CanBeState?, --- CanvasSize: CanBeState?, --- ElasticBehavior: CanBeState?, --- HorizontalScrollBarInset: CanBeState?, --- MidImage: CanBeState?, --- ScrollBarImageColor3: CanBeState?, --- ScrollBarImageTransparency: CanBeState?, --- ScrollBarThickness: CanBeState?, --- ScrollingDirection: CanBeState?, --- ScrollingEnabled: CanBeState?, --- TopImage: CanBeState?, --- VerticalScrollBarInset: CanBeState?, --- VerticalScrollBarPosition: CanBeState?, --- } - -export type ViewportFrameParameters = any --- GuiObjectParameters & { --- Ambient: CanBeState?, --- CurrentCamera: CanBeState?, --- ImageColor3: CanBeState?, --- ImageTransparency: CanBeState?, --- LightColor: CanBeState?, --- LightDirection: CanBeState?, --- } - -export type BillboardGuiParameters = any --- LayerCollectorParameters & { --- Active: CanBeState?, --- Adornee: CanBeState?, --- AlwaysOnTop: CanBeState?, --- Brightness: CanBeState?, --- ClipsDescendants: CanBeState?, --- CurrentDistance: CanBeState?, --- DistanceLowerLimit: CanBeState?, --- DistanceStep: CanBeState?, --- DistanceUpperLimit: CanBeState?, --- ExtentsOffset: CanBeState?, --- ExtentsOffsetWorldSpace: CanBeState?, --- LightInfluence: CanBeState?, --- MaxDistance: CanBeState?, --- PlayerToHideFrom: CanBeState?, --- Size: CanBeState?, --- SizeOffset: CanBeState?, --- StudsOffset: CanBeState?, --- StudsOffsetWorldSpace: CanBeState?, --- } - -export type ScreenGuiParameters = any --- LayerCollectorParameters & { --- DisplayOrder: CanBeState?, --- IgnoreGuiInset: CanBeState?, --- } - -export type SurfaceGuiParameters = any --- LayerCollectorParameters & { --- Active: CanBeState?, --- Adornee: CanBeState?, --- AlwaysOnTop: CanBeState?, --- Brightness: CanBeState?, --- CanvasSize: CanBeState?, --- ClipsDescendants: CanBeState?, --- Face: CanBeState?, --- LightInfluence: CanBeState?, --- PixelsPerStud: CanBeState?, --- SizingMode: CanBeState?, --- ToolPunchThroughDistance: CanBeState?, --- ZOffset: CanBeState?, --- } - -export type TextBoxParameters = any --- GuiObjectParameters & TextDisplay & { --- ClearTextOnFocus: CanBeState?, --- CursorPosition: CanBeState?, --- MultiLine: CanBeState?, --- PlaceholderColor3: CanBeState?, --- PlaceholderText: CanBeState?, --- TextEditable: CanBeState?, --- ShowNativeInput: CanBeState?, --- } - -return {} diff --git a/src/Util.lua b/src/Util.lua deleted file mode 100644 index 3da3f327..00000000 --- a/src/Util.lua +++ /dev/null @@ -1,59 +0,0 @@ ---!strict -local Package = script.Parent -assert(Package) -local Packages = Package.Parent -assert(Packages) - -local Maid = require(Packages:WaitForChild("Maid")) -type Maid = Maid.Maid - -local Signal = require(Packages:WaitForChild("Signal")) -type Signal = Signal.Signal - -local Util = {} -Util.__index = Util - -function Util.cleanUpPrep(maid: Maid, inst: Instance) - local compMaid = Maid.new() - compMaid:GiveTask(inst) - for i, desc in ipairs(inst:GetDescendants()) do - compMaid:GiveTask(desc) - end - - maid:GiveTask(compMaid) - - maid:GiveTask(inst.Destroying:Connect(function() - compMaid:Destroy() - maid:Destroy() - end)) -end - -function Util.bindFunction(inst: Instance, maid: Maid, name: string, func: F): BindableFunction & { OnInvoke: F } - assert(typeof(func) == "function") - local bindableFunction = Instance.new("BindableFunction") - bindableFunction.Name = name - bindableFunction.OnInvoke = func - maid:GiveTask(bindableFunction) - bindableFunction.Parent = inst - - local bFunc: any = bindableFunction - return bFunc -end - -function Util.bindSignal(inst: Instance, maid: Maid, name: string, signal: Signal): BindableEvent - local bindableEvent = Instance.new("BindableEvent") - bindableEvent.Name = name - - -- Maid:GiveTask(bindableEvent.Event:Connect(function(...) - -- signal:Fire(...) - -- end)) - maid:GiveTask(signal:Connect(function(...) - bindableEvent:Fire(...) - end)) - maid:GiveTask(bindableEvent) - bindableEvent.Parent = inst - - return bindableEvent -end - -return Util diff --git a/src/ViewportMountFrame/init.lua b/src/ViewportMountFrame/init.lua deleted file mode 100644 index a247c1a5..00000000 --- a/src/ViewportMountFrame/init.lua +++ /dev/null @@ -1,146 +0,0 @@ ---!strict - -local RunService = game:GetService("RunService") - -local Package = script.Parent -assert(Package) -local Packages = Package.Parent -assert(Packages) - -local Util = require(Package:WaitForChild("Util")) - -local Types = require(Package:WaitForChild("Types")) - -local ColdFusion = require(Packages:WaitForChild("ColdFusion")) -type Fuse = ColdFusion.Fuse -type State = ColdFusion.State -type ValueState = ColdFusion.ValueState -type CanBeState = ColdFusion.CanBeState - -local Maid = require(Packages:WaitForChild("Maid")) -type Maid = Maid.Maid - -export type ViewportMountFrameParameters = Types.ViewportFrameParameters & { - WorldPosition: CanBeState?, - WorldSize: CanBeState?, -} - -export type ViewportMountFrame = Frame - -function Constructor(config: ViewportMountFrameParameters): ViewportMountFrame - -- init workspace - local maid = Maid.new() - local _fuse = ColdFusion.fuse(maid) - local _new = _fuse.new - local _bind = _fuse.bind - local _import = _fuse.import - local _Value = _fuse.Value - local _Computed = _fuse.Computed - - -- unload config states - local WorldPosition = _import(config.WorldPosition, Vector2.new(0, 0)) - local WorldSize = _import(config.WorldSize, Vector2.new(0, 0)) - - -- init internal states - local Camera: ValueState = _Value(nil :: Camera?) - local BillboardFrame: ValueState = _Value(nil :: ViewportFrame?) - maid:GiveTask(BillboardFrame:Connect(function(cur: ViewportFrame?) - Camera:Set(nil) - if not cur then - return - end - assert(cur ~= nil) - maid._billboardCameraCheck = cur:GetPropertyChangedSignal("CurrentCamera"):Connect(function() - Camera:Set(cur.CurrentCamera) - end) - Camera:Set(cur.CurrentCamera) - end)) - - -- using signals here causes a noticeable drag when moving board camera - local CameraCFrame = _Value(CFrame.new(0, 0, 0)) - local FieldOfView = _Value(70) - local BoardAbsoluteSize = _Value(Vector2.new(0, 0)) - local BoardCameraWindowSize = _Value(Vector2.new(0, 0)) - - maid:GiveTask(RunService.Heartbeat:Connect(function(dt) - local cam = Camera:Get() - local boardFrame = BillboardFrame:Get() - if not cam or not boardFrame then - return - end - assert(cam ~= nil and boardFrame ~= nil) - CameraCFrame:Set(cam.CFrame) - FieldOfView:Set(cam.FieldOfView) - BoardAbsoluteSize:Set(boardFrame.AbsoluteSize) - BoardCameraWindowSize:Set(boardFrame:GetAttribute("CameraWindowSize")) - end)) - - -- assemble final parameters - local parameters: any = { - Name = _import(config.Name, script.Name), - Parent = _import(config.Parent, nil), - Size = _Computed(function(size: Vector2, winSize, boardSize) - boardSize = boardSize or Vector2.new(0, 0) - winSize = winSize or Vector2.new(0, 0) - local ratio = boardSize / winSize - local finalSize = size * ratio * 0.5 - return UDim2.fromOffset(finalSize.X, finalSize.Y) - end, WorldSize, BoardCameraWindowSize, BoardAbsoluteSize), - Position = _Computed(function(pos: Vector2, camCF, fov, viewportSize) - camCF = camCF or CFrame.new(0, 0, 0) - fov = fov or 10 - pos = pos or Vector2.new(0, 0) - viewportSize = viewportSize or Vector2.new(0, 0) - local pos3 = Vector3.new(pos.X, pos.Y, 0) - - --This is written by EgoMoose :D - local camSpacePoint = camCF:PointToObjectSpace(pos3) -- make point relative to camera so easier to work with - - local r = viewportSize.X / viewportSize.Y -- aspect ratio - local h = -camSpacePoint.Z * math.tan(math.rad(fov / 2)) -- calc height/2 - local w = r * h -- calc width/2 - - local corner = Vector3.new(-w, h, camSpacePoint.Z) -- find the top left corner of the far plane - local relative = camSpacePoint - corner -- get the 3d point relative to the corner - - local scaleX = relative.X / (w * 2) -- find the x percentage - local scaleY = -relative.Y / (h * 2) -- find the y percentage - - -- returns in pixels as opposed to scale - local finalPos = Vector2.new(scaleX * viewportSize.X, scaleY * viewportSize.Y) - - return UDim2.fromOffset(finalPos.X, finalPos.Y) - end, WorldPosition, CameraCFrame, FieldOfView, BoardAbsoluteSize), - } - - config.WorldPosition = nil - config.WorldSize = nil - - for k, v in pairs(config) do - if parameters[k] == nil then - parameters[k] = v - end - end - - -- construct output instance - local Output = _fuse.new("Frame")(parameters) - Util.cleanUpPrep(maid, Output) - - -- provide output inst to relevant states - BillboardFrame:Set(Output:FindFirstAncestorOfClass("ViewportFrame")) - maid:GiveTask(Output.AncestryChanged:Connect(function() - BillboardFrame:Set(Output:FindFirstAncestorOfClass("ViewportFrame")) - end)) - - return Output :: Frame -end - -return function(maid: Maid?) - return function(params: ViewportMountFrameParameters): ViewportMountFrame - local inst = Constructor(params) - if maid then - maid:GiveTask(inst) - end - return inst - end -end diff --git a/src/init.lua b/src/init.lua index 3ffab25c..27d3eb70 100644 --- a/src/init.lua +++ b/src/init.lua @@ -1,136 +1,15 @@ --!strict - -local Package = script -local Packages = Package.Parent -assert(Packages) - -local Maid = require(Packages:WaitForChild("Maid")) -export type Maid = Maid.Maid - -local Types = require(Package:WaitForChild("Types")) -export type CanBeState = Types.CanBeState - -local TextLabel = require(Package:WaitForChild("TextLabel")) -export type TextLabelParameters = TextLabel.TextLabelParameters - -local ViewportMountFrame = require(Package:WaitForChild("ViewportMountFrame")) -export type ViewportMountFrameParameters = ViewportMountFrame.ViewportMountFrameParameters - -local TextField = require(Package:WaitForChild("TextField")) -export type TextFieldParameters = TextField.TextFieldParameters - -local Switch = require(Package:WaitForChild("Switch")) -export type SwitchParameters = Switch.SwitchParameters - -local SurfaceFrame = require(Package:WaitForChild("SurfaceFrame")) -export type SurfaceFrameParameters = SurfaceFrame.SurfaceFrameParameters - -local Slider = require(Package:WaitForChild("Slider")) -export type SliderParameters = Slider.SliderParameters - -local RadioButton = require(Package:WaitForChild("RadioButton")) -export type RadioButtonParameters = RadioButton.RadioButtonParameters - -local IconLabel = require(Package:WaitForChild("IconLabel")) -export type IconLabelParameters = IconLabel.IconLabelParameters - -local Hint = require(Package:WaitForChild("Hint")) -export type HintParameters = Hint.HintParameters - -local EffectGui = require(Package:WaitForChild("EffectGui")) -export type EffectGuiParameters = EffectGui.EffectGuiParameters - -local Checkbox = require(Package:WaitForChild("Checkbox")) -export type CheckboxParameters = Checkbox.CheckboxParameters - -local Button = require(Package:WaitForChild("Button")) -export type ButtonParameters = Button.ButtonParameters - -local Bubble = require(Package:WaitForChild("Bubble")) -export type BubbleParameters = Bubble.BubbleParameters - -local BoundingBoxFrame = require(Package:WaitForChild("BoundingBoxFrame")) -export type BoundingBoxFrameParameters = BoundingBoxFrame.BoundingBoxFrameParameters - -local BoardFrame = require(Package:WaitForChild("BoardFrame")) -export type BoardFrameParameters = BoardFrame.BoardFrameParameters - -local BillboardFrame = require(Package:WaitForChild("BillboardFrame")) -export type BillboardFrameParameters = BillboardFrame.BillboardFrameParameters - -export type Synthetic = ( - ((className: "TextLabel") -> (TextLabelParameters) -> TextLabel.TextLabel) - & ((className: "ViewportMountFrame") -> (ViewportMountFrameParameters) -> ViewportMountFrame.ViewportMountFrame) - & ((className: "TextField") -> (TextFieldParameters) -> TextField.TextField) - & ((className: "Switch") -> (SwitchParameters) -> Switch.Switch) - & ((className: "SurfaceFrame") -> (SurfaceFrameParameters) -> SurfaceFrame.SurfaceFrameParameters) - & ((className: "Slider") -> (SliderParameters) -> Slider.Slider) - & ((className: "RadioButton") -> (RadioButtonParameters) -> RadioButton.RadioButton) - & ((className: "IconLabel") -> (IconLabelParameters) -> IconLabel.IconLabel) - & ((className: "Hint") -> (HintParameters) -> Hint.Hint) - & ((className: "EffectGui") -> (EffectGuiParameters) -> EffectGui.EffectGui) - & ((className: "Checkbox") -> (CheckboxParameters) -> Checkbox.Checkbox) - & ((className: "Button") -> (ButtonParameters) -> Button.Button) - & ((className: "Bubble") -> (BubbleParameters) -> Bubble.Bubble) - & ((className: "BoundingBoxFrame") -> (BoundingBoxFrameParameters) -> BoundingBoxFrame.BoundingBoxFrame) - & ((className: "BoardFrame") -> (BoardFrameParameters) -> BoardFrame.BoardFrame) - & ((className: "BillboardFrame") -> (BillboardFrameParameters) -> BillboardFrame.BillboardFrame) -) - -return function(maid: Maid?): Synthetic - return function(className: any): any - assert( - className == "TextLabel" - or className == "ViewportMountFrame" - or className == "TextField" - or className == "Switch" - or className == "SurfaceFrame" - or className == "Slider" - or className == "RadioButton" - or className == "IconLabel" - or className == "Hint" - or className == "EffectGui" - or className == "Checkbox" - or className == "ButtonList" - or className == "Button" - or className == "Bubble" - or className == "BoundingBoxFrame" - or className == "BoardFrame" - or className == "BillboardFrame" - ) - if className == "TextLabel" then - return TextLabel(maid) - elseif className == "ViewportMountFrame" then - return ViewportMountFrame(maid) - elseif className == "TextField" then - return TextField(maid) - elseif className == "Switch" then - return Switch(maid) - elseif className == "SurfaceFrame" then - return SurfaceFrame(maid) - elseif className == "Slider" then - return Slider(maid) - elseif className == "RadioButton" then - return RadioButton(maid) - elseif className == "IconLabel" then - return IconLabel(maid) - elseif className == "Hint" then - return Hint(maid) - elseif className == "EffectGui" then - return EffectGui(maid) - elseif className == "Checkbox" then - return Checkbox(maid) - elseif className == "Button" then - return Button(maid) - elseif className == "Bubble" then - return Bubble(maid) - elseif className == "BoundingBoxFrame" then - return BoundingBoxFrame(maid) - elseif className == "BoardFrame" then - return BoardFrame(maid) - elseif className == "BillboardFrame" then - return BillboardFrame(maid) - end - return nil - end -end +local _Package = script +local _Packages = _Package.Parent +-- Services +-- Packages +-- Modules +-- Types +-- Constants +-- Variables +-- References +-- Private Functions +-- Class +local Synthetic = {} + +return Synthetic \ No newline at end of file From 0cdc405a64c7dd5e24dd84778fe9dddaa83eba86 Mon Sep 17 00:00:00 2001 From: Nightcycle <77173389+nightcycle@users.noreply.github.com> Date: Sat, 2 Dec 2023 21:25:49 -0500 Subject: [PATCH 02/57] added sounds --- sounds.rbxm | Bin 0 -> 2359 bytes src/Sounds.luau | 42 ++++++++++++++++++++++++++++++++++++ src/{init.lua => init.luau} | 0 src/sounds.json | 0 4 files changed, 42 insertions(+) create mode 100644 sounds.rbxm create mode 100644 src/Sounds.luau rename src/{init.lua => init.luau} (100%) create mode 100644 src/sounds.json diff --git a/sounds.rbxm b/sounds.rbxm new file mode 100644 index 0000000000000000000000000000000000000000..96f87f3b2f269a993ec5dd7066383cc0cce9b775 GIT binary patch literal 2359 zcma)8&2Jk;6o0evSJE_Y)23;g;STYJ+?Pp?^?U- zG_3@*RDggU%7p``9uNnl3W?7PLOt}r32_9$f&T!*2_cYqZyU!YDS{`x@$Ag+H*e;> zH*Y-WIwi~5IPz9!_rTZyfCK<1P`k3USe!qKA5)tH?R^Y;!>EfJP0K8s{(Q@Ko_0*z z_d+=8yDf2Ud9`>5`=h8N?HIKY)TbP)B3z&)NC=q3-%scRrNd|@jJoQy>&s9P5E zo+tcsmBTcO!U#`RgY)5Uo5BLLaFN%%t&>rpzM>hF_8<-ai!TmCT!PmN0g%=vCq5r6 zgHDf9XQxXTbf$ZZX~Zl9d}IuDO+C;n6s`bCmQG^tvo0?}yj`e^4b%69yNY27y~bdF z;xsiFZN0~&!>w-au^pxkrYAh>IL#GNGaY*r;qpssXQB{~L1zMq_(3Mgi#jUFy^Nwj z5K&YlB;B{WKJ@DZxfSKFhsefO@F+qp({M%A6<*z_3Q?il;g)cHL%6Qv8nQYJf5bEj zlFir68uxKqMw#1XVU3Ld_g!v#W)cibRQ-uWBaG!qq?&$T*K$h69*yuE&R%iveRfa5w^Ii5^A3C6nne1}ItG6g((LD@?SYHx;K?BA*$Gc|xhOCSLOQ_he zHXF>r$<)LTFjQjS>_Iy&9>;fVahypPq?>j0fPuwA9G8w=9$c4_o;k|cGUJYKR?YGu zcFo|8k|_`&#SX&hiYPmC%vcv_WD*AUs@J9191L8CJqNynSOTQCA%|0A5E)j#gj*cX zP(!jMuE9cGxXv6ze`E`WtW8cr^mFK+f`mE+LkX<}1B|iwRfxndz^(!YPF5&;j^LIb zM0oIEh@uh=0E z%2%sPPDKpkb$YY6_Ho32ib~Siy0SqnKjS*B=01d1;2kPPgFV)ZxQXWGCG1RecNDPB zRoFpX%Pnnis*q;o)Xa>MPHVE9RWd1U9Kv~3OQ+~p$;z4FJFUp$5SfuPS%}VLa4wot z6{Sd!Sv8H2oT_K;Lda2MT~o7J=ra^KtEP$&q7LyQd0kG;A|YCaUwDM0ShB6 zlS(%slFO)BvZZH#Mk|^0>r%0IDC4p;x3MF^^-i@0JorRaY`D6eUmti{54Ev08~ zpaqSN5zWys?pM)iSuHK!A&4ex0aTmSzL#)!nx?8(`$Bm|OJyGI!+q##O1~wA^SY|c z-lgrTdJ$qXvWm0#q2Z1Tx|-Hi%4{m(=gGY&y@c8J0AbY+C-51L7w~ql;31-7aXVlE z+#x>2ir%5Y|MjXA&4wsA9zL{=9mWK>|5ZuiN*|+=^h))4$7(f1=#`zxJBzrl12p2X z6akE&ZZxbF!7IiR-&ioQtYQ5%w9pNrXQ{cmxzJYOUoO%cv9#%n9RA^9utxtg_9yZm a!WyRMJt$jTUI?u92Q9$d%)P%$Py7vGd(sI2 literal 0 HcmV?d00001 diff --git a/src/Sounds.luau b/src/Sounds.luau new file mode 100644 index 00000000..db4e2d80 --- /dev/null +++ b/src/Sounds.luau @@ -0,0 +1,42 @@ +return { + hero_simple_celebration_02 = "rbxassetid://15530172366", + navigation_cancel = "rbxassetid://15530082510", + ui_tap_variant_03 = "rbxassetid://15530107510", + alert_error_03 = "rbxassetid://15530081806", + notification_ambient = "rbxassetid://15530133360", + state_change_confirm_up = "rbxassetid://15530106459", + ringtone_minimal = "rbxassetid://15530133688", + hero_decorative_celebration_01 = "rbxassetid://15530172572", + navigation_transition_right = "rbxassetid://15530082646", + hero_decorative_celebration_02 = "rbxassetid://15530172198", + alert_simple = "rbxassetid://15530134380", + ui_loading = "rbxassetid://15530081925", + notification_decorative_01 = "rbxassetid://15530134178", + notification_high_intensity = "rbxassetid://15530133039", + navigation_backward_selection_minimal = "rbxassetid://15530108245", + navigation_unavailable_selection = "rbxassetid://15530082211", + ui_unlock = "rbxassetid://15530107328", + notification_decorative_02 = "rbxassetid://15530133501", + navigation_hover_tap = "rbxassetid://15530107661", + ui_tap_variant_01 = "rbxassetid://15530106592", + ui_tap_variant_04 = "rbxassetid://15530106152", + ui_tap_variant_02 = "rbxassetid://15530106800", + alert_error_02 = "rbxassetid://15530082354", + alarm_gentle = "rbxassetid://15530134666", + ui_refresh_feed = "rbxassetid://15530081643", + hero_simple_celebration_01 = "rbxassetid://15530172024", + hero_decorative_celebration_03 = "rbxassetid://15530172766", + hero_simple_celebration_03 = "rbxassetid://15530172475", + alert_high_intensity = "rbxassetid://15530134780", + state_change_confirm_down = "rbxassetid://15530107943", + navigation_transition_left = "rbxassetid://15530082066", + notification_simple_01 = "rbxassetid://15530133936", + navigation_forward_selection = "rbxassetid://15530108068", + navigation_selection_complete_celebration = "rbxassetid://15530107202", + ui_camera_shutter = "rbxassetid://15530106289", + navigation_forward_selection_minimal = "rbxassetid://15530107049", + notification_simple_02 = "rbxassetid://15530133223", + navigation_backward_selection = "rbxassetid://15530108417", + ui_lock = "rbxassetid://15530107845", + alert_error_01 = "rbxassetid://15530082764" +} \ No newline at end of file diff --git a/src/init.lua b/src/init.luau similarity index 100% rename from src/init.lua rename to src/init.luau diff --git a/src/sounds.json b/src/sounds.json new file mode 100644 index 00000000..e69de29b From 35751783e00c447bd16a0867405a361582578b70 Mon Sep 17 00:00:00 2001 From: Nightcycle <77173389+nightcycle@users.noreply.github.com> Date: Tue, 5 Dec 2023 16:56:01 -0500 Subject: [PATCH 03/57] Created TextButton --- .github/workflows/commit.yml | 79 ++++ README.md | 5 +- blur.png | Bin 0 -> 130225 bytes foreman.toml | 1 + pseudo-enum.toml | 7 + scripts/pseudo-enum.sh | 2 + scripts/test/download.sh | 1 - scripts/workspace/build-project.sh | 2 + scripts/workspace/install-packages.sh | 4 + scripts/{ => workspace}/serve.sh | 0 scripts/{ => workspace}/sourcemap.sh | 0 scripts/{ => workspace}/update-packages.sh | 0 src/sounds.json => sounds.json | 0 sourcemap.json | 2 +- .../Button/TextButton/cfusion.story.luau | 128 ++++++ src/Component/Button/TextButton/init.luau | 375 ++++++++++++++++++ src/{Test/init.luau => Config.luau} | 9 +- src/DropShadow/init.luau | 55 +++ src/Enums.luau | 49 +++ src/Types.luau | 98 +++++ src/Util.luau | 171 ++++++++ synthetic.rbxl.lock | 5 + wally.lock | 27 +- wally.toml | 4 + 24 files changed, 1017 insertions(+), 7 deletions(-) create mode 100644 .github/workflows/commit.yml create mode 100644 blur.png create mode 100644 pseudo-enum.toml create mode 100644 scripts/pseudo-enum.sh create mode 100644 scripts/workspace/build-project.sh create mode 100644 scripts/workspace/install-packages.sh rename scripts/{ => workspace}/serve.sh (100%) rename scripts/{ => workspace}/sourcemap.sh (100%) rename scripts/{ => workspace}/update-packages.sh (100%) rename src/sounds.json => sounds.json (100%) create mode 100644 src/Component/Button/TextButton/cfusion.story.luau create mode 100644 src/Component/Button/TextButton/init.luau rename src/{Test/init.luau => Config.luau} (63%) create mode 100644 src/DropShadow/init.luau create mode 100644 src/Enums.luau create mode 100644 src/Types.luau create mode 100644 src/Util.luau create mode 100644 synthetic.rbxl.lock diff --git a/.github/workflows/commit.yml b/.github/workflows/commit.yml new file mode 100644 index 00000000..76c72977 --- /dev/null +++ b/.github/workflows/commit.yml @@ -0,0 +1,79 @@ +name: Validate Commit + +on: + push: + +jobs: + + validate: + runs-on: windows-latest + + strategy: + matrix: + scene: [main] + include: + - name: main + steps: + # Checkout your Git repo + - uses: actions/checkout@v2 + + # Install foreman and all foreman tools + - uses: Roblox/setup-foreman@v1 + with: + token: ${{ secrets.GITHUB_TOKEN }} + # Install wally packages + - name: update wally packages + run: wally-update patch + + - name: install wally packages + run: wally install + + - name: generate sourcemap + run: rojo sourcemap dev.project.json --output sourcemap.json + + - name: export wally package types + run: wally-package-types --sourcemap sourcemap.json Packages + + - name: Install testing files + shell: bash + run: | + # type definitions + if [ ! -d "types" ]; then + mkdir "types" + fi + curl -L "https://gist.github.com/nightcycle/50ca8f42147077b8f584b503030c8500/raw" > "types/testEZ.d.lua" + curl -L "https://gist.github.com/nightcycle/ae7ea3376337512772d1d2b314ef467b/raw" > "types/remodel.d.lua" + curl -L "https://raw.githubusercontent.com/JohnnyMorganz/luau-lsp/main/scripts/globalTypes.d.lua" > "types/globalTypes.d.lua" + + # lint definitions + if [ ! -d "lints" ]; then + mkdir "lints" + fi + curl -L "https://gist.github.com/nightcycle/a57e04de443dfa89bd08c8eb001b03c6/raw" > "lints/lua51.yml" + curl -L "https://gist.github.com/nightcycle/93c4b9af5bbf4ed09f39aa908dffccd0/raw" > "lints/luau.yml" + curl -L "https://gist.github.com/nightcycle/e8c4a9a1d71cfd1a1fff59cad84156d1/raw" > "lints/roblox.yml" + + # apply code styling + - name: style src scripts + run: stylua src + + # - name: style built scripts + # shell: bash + # run: | + # if [ ! -d "out" ]; then + # mkdir "out" + # fi + # stylua out + + - name: generate sourcemap + run: rojo sourcemap dev.project.json --output sourcemap.json + + # Test validity + - name: typecheck src files + run: luau-lsp analyze src --sourcemap=sourcemap.json --ignore="Packages/**" --ignore="**/Packages/**" --ignore="*.spec.luau" --ignore="out/**" --flag:LuauTypeInferIterationLimit=0 --flag:LuauCheckRecursionLimit=0 --flag:LuauTypeInferRecursionLimit=0 --flag:LuauTarjanChildLimit=0 --flag:LuauTypeInferTypePackLoopLimit=0 --flag:LuauVisitRecursionLimit=0 --definitions=types/globalTypes.d.lua --flag:LuauParseDeclareClassIndexer=true + + - name: lint src files + run: selene src + + # - name: lint built files + # run: selene out \ No newline at end of file diff --git a/README.md b/README.md index 73775680..77e28769 100644 --- a/README.md +++ b/README.md @@ -29,5 +29,8 @@ Components will attempt to aesthetically render as well as mimic under the follo ## Components +### Material 3 +https://m3.material.io/components - +### Material 2 +https://m2.material.io/components diff --git a/blur.png b/blur.png new file mode 100644 index 0000000000000000000000000000000000000000..8908b0cd5de137ff30e496c1ade03224481ccd10 GIT binary patch literal 130225 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 ky^mG_*Ob@fUBSLF@(X!5N_6qo0bpGD!SC "lints/lua51.yml" curl -L "https://gist.github.com/nightcycle/93c4b9af5bbf4ed09f39aa908dffccd0/raw" > "lints/luau.yml" -curl -L "https://gist.github.com/nightcycle/e8c4a9a1d71cfd1a1fff59cad84156d1/raw" > "lints/roblox.yml" \ No newline at end of file diff --git a/scripts/workspace/build-project.sh b/scripts/workspace/build-project.sh new file mode 100644 index 00000000..4d406d5b --- /dev/null +++ b/scripts/workspace/build-project.sh @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +rojo build --output synthetic.rbxl dev.project.json \ No newline at end of file diff --git a/scripts/workspace/install-packages.sh b/scripts/workspace/install-packages.sh new file mode 100644 index 00000000..d230493c --- /dev/null +++ b/scripts/workspace/install-packages.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +wally install +rojo sourcemap dev.project.json --output sourcemap.json +wally-package-types --sourcemap sourcemap.json Packages \ No newline at end of file diff --git a/scripts/serve.sh b/scripts/workspace/serve.sh similarity index 100% rename from scripts/serve.sh rename to scripts/workspace/serve.sh diff --git a/scripts/sourcemap.sh b/scripts/workspace/sourcemap.sh similarity index 100% rename from scripts/sourcemap.sh rename to scripts/workspace/sourcemap.sh diff --git a/scripts/update-packages.sh b/scripts/workspace/update-packages.sh similarity index 100% rename from scripts/update-packages.sh rename to scripts/workspace/update-packages.sh diff --git a/src/sounds.json b/sounds.json similarity index 100% rename from src/sounds.json rename to sounds.json diff --git a/sourcemap.json b/sourcemap.json index 0b39328b..84068a39 100644 --- a/sourcemap.json +++ b/sourcemap.json @@ -1 +1 @@ -{"name":"synthetic-test","className":"DataModel","filePaths":["dev.project.json"],"children":[{"name":"ReplicatedStorage","className":"ReplicatedStorage","children":[{"name":"Packages","className":"Folder","children":[{"name":"ColdFusion","className":"ModuleScript","filePaths":["Packages\\ColdFusion.lua"]},{"name":"Format","className":"ModuleScript","filePaths":["Packages\\Format.lua"]},{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\Maid.lua"]},{"name":"MeshUtil","className":"ModuleScript","filePaths":["Packages\\MeshUtil.lua"]},{"name":"Signal","className":"ModuleScript","filePaths":["Packages\\Signal.lua"]},{"name":"_Index","className":"Folder","children":[{"name":"nightcycle_cold-fusion@9.0.7","className":"Folder","children":[{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\Maid.lua"]},{"name":"ServiceProxy","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\ServiceProxy.lua"]},{"name":"Signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\Signal.lua"]},{"name":"TableUtil","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\TableUtil.lua"]},{"name":"cold-fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\init.luau","Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\default.project.json"],"children":[{"name":"Fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\init.lua"],"children":[{"name":"Animation","className":"Folder","children":[{"name":"Spring","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\Spring.lua"]},{"name":"SpringScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\SpringScheduler.lua"]},{"name":"Tween","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\Tween.lua"]},{"name":"TweenScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\TweenScheduler.lua"]},{"name":"getTweenRatio","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\getTweenRatio.lua"]},{"name":"lerpType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\lerpType.lua"]},{"name":"packType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\packType.lua"]},{"name":"springCoefficients","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\springCoefficients.lua"]},{"name":"unpackType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\unpackType.lua"]}]},{"name":"Colour","className":"Folder","children":[{"name":"Oklab","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Colour\\Oklab.lua"]}]},{"name":"Instances","className":"Folder","children":[{"name":"Attribute","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Attribute.lua"]},{"name":"AttributeChange","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\AttributeChange.lua"]},{"name":"AttributeOut","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\AttributeOut.lua"]},{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Children.lua"]},{"name":"Cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Cleanup.lua"]},{"name":"Hydrate","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Hydrate.lua"]},{"name":"New","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\New.lua"]},{"name":"OnChange","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\OnChange.lua"]},{"name":"OnEvent","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\OnEvent.lua"]},{"name":"Out","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Out.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Ref.lua"]},{"name":"applyInstanceProps","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\applyInstanceProps.lua"]},{"name":"defaultProps","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\defaultProps.lua"]}]},{"name":"Logging","className":"Folder","children":[{"name":"logError","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logError.lua"]},{"name":"logErrorNonFatal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logErrorNonFatal.lua"]},{"name":"logWarn","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logWarn.lua"]},{"name":"messages","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\messages.lua"]},{"name":"parseError","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\parseError.lua"]}]},{"name":"PubTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\PubTypes.lua"]},{"name":"State","className":"Folder","children":[{"name":"Computed","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Computed.lua"]},{"name":"ForKeys","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForKeys.lua"]},{"name":"ForPairs","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForPairs.lua"]},{"name":"ForValues","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForValues.lua"]},{"name":"Observer","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Observer.lua"]},{"name":"Value","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Value.lua"]},{"name":"isState","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\isState.lua"]},{"name":"makeUseCallback","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\makeUseCallback.lua"]},{"name":"peek","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\peek.lua"]},{"name":"updateAll","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\updateAll.lua"]}]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Types.lua"]},{"name":"Utility","className":"Folder","children":[{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\None.lua"]},{"name":"cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\cleanup.lua"]},{"name":"doNothing","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\doNothing.lua"]},{"name":"isSimilar","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\isSimilar.lua"]},{"name":"needsDestruction","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\needsDestruction.lua"]},{"name":"restrictRead","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\restrictRead.lua"]},{"name":"xtypeof","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\xtypeof.lua"]}]}]},{"name":"InstanceTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\InstanceTypes.luau"]},{"name":"Interface","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Interface.luau"]},{"name":"Test.story","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Test.story.luau"]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Types.luau"]},{"name":"Util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Util.luau"]}]}]},{"name":"nightcycle_format@0.1.3","className":"Folder","children":[{"name":"format","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\init.lua","Packages\\_Index\\nightcycle_format@0.1.3\\format\\default.project.json"],"children":[{"name":"Emoji","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\Emoji.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\init.spec.lua"]}]},{"name":"maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\maid.lua"]},{"name":"signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\signal.lua"]},{"name":"string","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\string.lua"]}]},{"name":"nightcycle_geometry-util@1.1.1","className":"Folder","children":[{"name":"geometry-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\init.lua","Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\default.project.json"],"children":[{"name":"Earcut","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\Earcut\\init.lua"],"children":[{"name":"ZeroArray","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\Earcut\\ZeroArray.lua"]}]}]}]},{"name":"nightcycle_maid@1.1.4","className":"Folder","children":[{"name":"maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\init.lua","Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\default.project.json"],"children":[{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\Maid.lua"]},{"name":"MaidTaskUtils","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\MaidTaskUtils.lua"]}]}]},{"name":"nightcycle_mesh-util@1.0.3","className":"Folder","children":[{"name":"GeometryUtil","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\GeometryUtil.lua"]},{"name":"mesh-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\init.lua","Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\default.project.json"],"children":[{"name":"CornerWedgePart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\CornerWedgePart.lua"]},{"name":"Part","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\Part.lua"]},{"name":"TetraPart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\TetraPart.lua"]},{"name":"WedgePart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\WedgePart.lua"]}]}]},{"name":"nightcycle_service-proxy@1.0.0","className":"Folder","children":[{"name":"service-proxy","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_service-proxy@1.0.0\\service-proxy\\src\\init.lua","Packages\\_Index\\nightcycle_service-proxy@1.0.0\\service-proxy\\default.project.json"]}]},{"name":"nightcycle_signal@1.0.2","className":"Folder","children":[{"name":"signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_signal@1.0.2\\signal\\src\\init.lua","Packages\\_Index\\nightcycle_signal@1.0.2\\signal\\default.project.json"]}]},{"name":"nightcycle_string@0.1.0","className":"Folder","children":[{"name":"string","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_string@0.1.0\\string\\src\\init.lua","Packages\\_Index\\nightcycle_string@0.1.0\\string\\default.project.json"],"children":[{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_string@0.1.0\\string\\src\\init.spec.lua"]}]}]},{"name":"nightcycle_table-util@1.1.0","className":"Folder","children":[{"name":"table-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_table-util@1.1.0\\table-util\\src\\init.lua","Packages\\_Index\\nightcycle_table-util@1.1.0\\table-util\\default.project.json"]}]}]},{"name":"synthetic","className":"ModuleScript","filePaths":["src\\init.lua"]}]}]}]} \ No newline at end of file +{"name":"synthetic-test","className":"DataModel","filePaths":["dev.project.json"],"children":[{"name":"ReplicatedStorage","className":"ReplicatedStorage","children":[{"name":"Packages","className":"Folder","children":[{"name":"ColdFusion","className":"ModuleScript","filePaths":["Packages\\ColdFusion.lua"]},{"name":"CurveUtil","className":"ModuleScript","filePaths":["Packages\\CurveUtil.lua"]},{"name":"Format","className":"ModuleScript","filePaths":["Packages\\Format.lua"]},{"name":"Fusion","className":"ModuleScript","filePaths":["Packages\\Fusion.lua"]},{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\Maid.lua"]},{"name":"MaterialIcons","className":"ModuleScript","filePaths":["Packages\\MaterialIcons.lua"]},{"name":"MeshUtil","className":"ModuleScript","filePaths":["Packages\\MeshUtil.lua"]},{"name":"Roact","className":"ModuleScript","filePaths":["Packages\\Roact.lua"]},{"name":"Signal","className":"ModuleScript","filePaths":["Packages\\Signal.lua"]},{"name":"_Index","className":"Folder","children":[{"name":"elttob_fusion@0.2.0","className":"Folder","children":[{"name":"fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\init.lua","Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\default.project.json"],"children":[{"name":"Animation","className":"Folder","children":[{"name":"Spring","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\Spring.lua"]},{"name":"SpringScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\SpringScheduler.lua"]},{"name":"Tween","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\Tween.lua"]},{"name":"TweenScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\TweenScheduler.lua"]},{"name":"getTweenRatio","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\getTweenRatio.lua"]},{"name":"lerpType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\lerpType.lua"]},{"name":"packType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\packType.lua"]},{"name":"springCoefficients","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\springCoefficients.lua"]},{"name":"unpackType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\unpackType.lua"]}]},{"name":"Colour","className":"Folder","children":[{"name":"Oklab","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Colour\\Oklab.lua"]}]},{"name":"Dependencies","className":"Folder","children":[{"name":"captureDependencies","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\captureDependencies.lua"]},{"name":"initDependency","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\initDependency.lua"]},{"name":"sharedState","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\sharedState.lua"]},{"name":"updateAll","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\updateAll.lua"]},{"name":"useDependency","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\useDependency.lua"]}]},{"name":"Instances","className":"Folder","children":[{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Children.lua"]},{"name":"Cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Cleanup.lua"]},{"name":"Hydrate","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Hydrate.lua"]},{"name":"New","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\New.lua"]},{"name":"OnChange","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\OnChange.lua"]},{"name":"OnEvent","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\OnEvent.lua"]},{"name":"Out","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Out.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Ref.lua"]},{"name":"applyInstanceProps","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\applyInstanceProps.lua"]},{"name":"defaultProps","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\defaultProps.lua"]}]},{"name":"Logging","className":"Folder","children":[{"name":"logError","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logError.lua"]},{"name":"logErrorNonFatal","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logErrorNonFatal.lua"]},{"name":"logWarn","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logWarn.lua"]},{"name":"messages","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\messages.lua"]},{"name":"parseError","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\parseError.lua"]}]},{"name":"PubTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\PubTypes.lua"]},{"name":"State","className":"Folder","children":[{"name":"Computed","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Computed.lua"]},{"name":"ForKeys","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForKeys.lua"]},{"name":"ForPairs","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForPairs.lua"]},{"name":"ForValues","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForValues.lua"]},{"name":"Observer","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Observer.lua"]},{"name":"Value","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Value.lua"]},{"name":"unwrap","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\unwrap.lua"]}]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Types.lua"]},{"name":"Utility","className":"Folder","children":[{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\None.lua"]},{"name":"cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\cleanup.lua"]},{"name":"doNothing","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\doNothing.lua"]},{"name":"isSimilar","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\isSimilar.lua"]},{"name":"needsDestruction","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\needsDestruction.lua"]},{"name":"restrictRead","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\restrictRead.lua"]},{"name":"xtypeof","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\xtypeof.lua"]}]}]}]},{"name":"nightcycle_cold-fusion@9.0.7","className":"Folder","children":[{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\Maid.lua"]},{"name":"ServiceProxy","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\ServiceProxy.lua"]},{"name":"Signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\Signal.lua"]},{"name":"TableUtil","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\TableUtil.lua"]},{"name":"cold-fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\init.luau","Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\default.project.json"],"children":[{"name":"Fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\init.lua"],"children":[{"name":"Animation","className":"Folder","children":[{"name":"Spring","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\Spring.lua"]},{"name":"SpringScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\SpringScheduler.lua"]},{"name":"Tween","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\Tween.lua"]},{"name":"TweenScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\TweenScheduler.lua"]},{"name":"getTweenRatio","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\getTweenRatio.lua"]},{"name":"lerpType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\lerpType.lua"]},{"name":"packType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\packType.lua"]},{"name":"springCoefficients","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\springCoefficients.lua"]},{"name":"unpackType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\unpackType.lua"]}]},{"name":"Colour","className":"Folder","children":[{"name":"Oklab","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Colour\\Oklab.lua"]}]},{"name":"Instances","className":"Folder","children":[{"name":"Attribute","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Attribute.lua"]},{"name":"AttributeChange","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\AttributeChange.lua"]},{"name":"AttributeOut","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\AttributeOut.lua"]},{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Children.lua"]},{"name":"Cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Cleanup.lua"]},{"name":"Hydrate","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Hydrate.lua"]},{"name":"New","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\New.lua"]},{"name":"OnChange","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\OnChange.lua"]},{"name":"OnEvent","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\OnEvent.lua"]},{"name":"Out","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Out.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Ref.lua"]},{"name":"applyInstanceProps","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\applyInstanceProps.lua"]},{"name":"defaultProps","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\defaultProps.lua"]}]},{"name":"Logging","className":"Folder","children":[{"name":"logError","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logError.lua"]},{"name":"logErrorNonFatal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logErrorNonFatal.lua"]},{"name":"logWarn","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logWarn.lua"]},{"name":"messages","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\messages.lua"]},{"name":"parseError","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\parseError.lua"]}]},{"name":"PubTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\PubTypes.lua"]},{"name":"State","className":"Folder","children":[{"name":"Computed","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Computed.lua"]},{"name":"ForKeys","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForKeys.lua"]},{"name":"ForPairs","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForPairs.lua"]},{"name":"ForValues","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForValues.lua"]},{"name":"Observer","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Observer.lua"]},{"name":"Value","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Value.lua"]},{"name":"isState","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\isState.lua"]},{"name":"makeUseCallback","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\makeUseCallback.lua"]},{"name":"peek","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\peek.lua"]},{"name":"updateAll","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\updateAll.lua"]}]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Types.lua"]},{"name":"Utility","className":"Folder","children":[{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\None.lua"]},{"name":"cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\cleanup.lua"]},{"name":"doNothing","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\doNothing.lua"]},{"name":"isSimilar","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\isSimilar.lua"]},{"name":"needsDestruction","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\needsDestruction.lua"]},{"name":"restrictRead","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\restrictRead.lua"]},{"name":"xtypeof","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\xtypeof.lua"]}]}]},{"name":"InstanceTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\InstanceTypes.luau"]},{"name":"Interface","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Interface.luau"]},{"name":"Test.story","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Test.story.luau"]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Types.luau"]},{"name":"Util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Util.luau"]}]}]},{"name":"nightcycle_curve-util@1.0.0","className":"Folder","children":[{"name":"Vector","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\Vector.lua"]},{"name":"curve-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\init.lua","Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\default.project.json"],"children":[{"name":"Ease","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\Ease.lua"]},{"name":"Lerp","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\Lerp.lua"]}]}]},{"name":"nightcycle_format@0.1.3","className":"Folder","children":[{"name":"format","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\init.lua","Packages\\_Index\\nightcycle_format@0.1.3\\format\\default.project.json"],"children":[{"name":"Emoji","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\Emoji.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\init.spec.lua"]}]},{"name":"maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\maid.lua"]},{"name":"signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\signal.lua"]},{"name":"string","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\string.lua"]}]},{"name":"nightcycle_geometry-util@1.1.1","className":"Folder","children":[{"name":"geometry-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\init.lua","Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\default.project.json"],"children":[{"name":"Earcut","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\Earcut\\init.lua"],"children":[{"name":"ZeroArray","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\Earcut\\ZeroArray.lua"]}]}]}]},{"name":"nightcycle_maid@1.1.4","className":"Folder","children":[{"name":"maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\init.lua","Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\default.project.json"],"children":[{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\Maid.lua"]},{"name":"MaidTaskUtils","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\MaidTaskUtils.lua"]}]}]},{"name":"nightcycle_material-icons@1.0.1","className":"Folder","children":[{"name":"material-icons","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\init.luau","Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\default.project.json"],"children":[{"name":"Default_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_1.luau"]},{"name":"Default_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_2.luau"]},{"name":"Default_18_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_3.luau"]},{"name":"Default_18_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_4.luau"]},{"name":"Default_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_1.luau"]},{"name":"Default_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_2.luau"]},{"name":"Default_24_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_3.luau"]},{"name":"Default_24_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_4.luau"]},{"name":"Default_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_1.luau"]},{"name":"Default_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_2.luau"]},{"name":"Default_36_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_3.luau"]},{"name":"Default_36_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_4.luau"]},{"name":"Default_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_1.luau"]},{"name":"Default_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_2.luau"]},{"name":"Default_48_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_3.luau"]},{"name":"Default_48_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_4.luau"]},{"name":"Outlined_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_18_1.luau"]},{"name":"Outlined_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_18_2.luau"]},{"name":"Outlined_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_24_1.luau"]},{"name":"Outlined_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_24_2.luau"]},{"name":"Outlined_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_36_1.luau"]},{"name":"Outlined_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_36_2.luau"]},{"name":"Outlined_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_48_1.luau"]},{"name":"Outlined_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_48_2.luau"]},{"name":"Round_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_18_1.luau"]},{"name":"Round_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_18_2.luau"]},{"name":"Round_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_24_1.luau"]},{"name":"Round_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_24_2.luau"]},{"name":"Round_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_36_1.luau"]},{"name":"Round_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_36_2.luau"]},{"name":"Round_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_48_1.luau"]},{"name":"Round_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_48_2.luau"]},{"name":"Sharp_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_18_1.luau"]},{"name":"Sharp_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_18_2.luau"]},{"name":"Sharp_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_24_1.luau"]},{"name":"Sharp_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_24_2.luau"]},{"name":"Sharp_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_36_1.luau"]},{"name":"Sharp_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_36_2.luau"]},{"name":"Sharp_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_48_1.luau"]},{"name":"Sharp_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_48_2.luau"]},{"name":"TwoTone_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_18_1.luau"]},{"name":"TwoTone_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_18_2.luau"]},{"name":"TwoTone_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_24_1.luau"]},{"name":"TwoTone_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_24_2.luau"]},{"name":"TwoTone_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_36_1.luau"]},{"name":"TwoTone_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_36_2.luau"]},{"name":"TwoTone_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_48_1.luau"]},{"name":"TwoTone_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_48_2.luau"]}]}]},{"name":"nightcycle_mesh-util@1.0.3","className":"Folder","children":[{"name":"GeometryUtil","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\GeometryUtil.lua"]},{"name":"mesh-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\init.lua","Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\default.project.json"],"children":[{"name":"CornerWedgePart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\CornerWedgePart.lua"]},{"name":"Part","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\Part.lua"]},{"name":"TetraPart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\TetraPart.lua"]},{"name":"WedgePart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\WedgePart.lua"]}]}]},{"name":"nightcycle_service-proxy@1.0.0","className":"Folder","children":[{"name":"service-proxy","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_service-proxy@1.0.0\\service-proxy\\src\\init.lua","Packages\\_Index\\nightcycle_service-proxy@1.0.0\\service-proxy\\default.project.json"]}]},{"name":"nightcycle_signal@1.0.2","className":"Folder","children":[{"name":"signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_signal@1.0.2\\signal\\src\\init.lua","Packages\\_Index\\nightcycle_signal@1.0.2\\signal\\default.project.json"]}]},{"name":"nightcycle_string@0.1.0","className":"Folder","children":[{"name":"string","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_string@0.1.0\\string\\src\\init.lua","Packages\\_Index\\nightcycle_string@0.1.0\\string\\default.project.json"],"children":[{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_string@0.1.0\\string\\src\\init.spec.lua"]}]}]},{"name":"nightcycle_table-util@1.1.0","className":"Folder","children":[{"name":"table-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_table-util@1.1.0\\table-util\\src\\init.lua","Packages\\_Index\\nightcycle_table-util@1.1.0\\table-util\\default.project.json"]}]},{"name":"nightcycle_vector@1.0.2","className":"Folder","children":[{"name":"vector","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_vector@1.0.2\\vector\\src\\init.lua","Packages\\_Index\\nightcycle_vector@1.0.2\\vector\\default.project.json"]}]},{"name":"roblox_roact@1.4.4","className":"Folder","children":[{"name":"roact","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\init.lua","Packages\\_Index\\roblox_roact@1.4.4\\roact\\default.project.json"],"children":[{"name":"Binding","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Binding.lua"]},{"name":"Binding.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Binding.spec.lua"]},{"name":"Component","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.lua"]},{"name":"Component.spec","className":"Folder","children":[{"name":"context.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\context.spec.lua"]},{"name":"defaultProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\defaultProps.spec.lua"]},{"name":"didMount.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\didMount.spec.lua"]},{"name":"didUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\didUpdate.spec.lua"]},{"name":"extend.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\extend.spec.lua"]},{"name":"getDerivedStateFromProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\getDerivedStateFromProps.spec.lua"]},{"name":"getElementTraceback.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\getElementTraceback.spec.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\init.spec.lua"]},{"name":"legacyContext.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\legacyContext.spec.lua"]},{"name":"render.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\render.spec.lua"]},{"name":"setState.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\setState.spec.lua"]},{"name":"shouldUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\shouldUpdate.spec.lua"]},{"name":"validateProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\validateProps.spec.lua"]},{"name":"willUnmount.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\willUnmount.spec.lua"]},{"name":"willUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\willUpdate.spec.lua"]}]},{"name":"ComponentLifecyclePhase","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ComponentLifecyclePhase.lua"]},{"name":"Config","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Config.lua"]},{"name":"Config.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Config.spec.lua"]},{"name":"ElementKind","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementKind.lua"]},{"name":"ElementKind.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementKind.spec.lua"]},{"name":"ElementUtils","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementUtils.lua"]},{"name":"ElementUtils.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementUtils.spec.lua"]},{"name":"GlobalConfig","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\GlobalConfig.lua"]},{"name":"GlobalConfig.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\GlobalConfig.spec.lua"]},{"name":"Logging","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Logging.lua"]},{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\None.lua"]},{"name":"NoopRenderer","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\NoopRenderer.lua"]},{"name":"Portal","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Portal.lua"]},{"name":"PropMarkers","className":"Folder","children":[{"name":"Change","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Change.lua"]},{"name":"Change.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Change.spec.lua"]},{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Children.lua"]},{"name":"Event","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Event.lua"]},{"name":"Event.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Event.spec.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Ref.lua"]}]},{"name":"PureComponent","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PureComponent.lua"]},{"name":"PureComponent.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PureComponent.spec.lua"]},{"name":"RobloxRenderer","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\RobloxRenderer.lua"]},{"name":"RobloxRenderer.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\RobloxRenderer.spec.lua"]},{"name":"SingleEventManager","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\SingleEventManager.lua"]},{"name":"SingleEventManager.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\SingleEventManager.spec.lua"]},{"name":"Symbol","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Symbol.lua"]},{"name":"Symbol.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Symbol.spec.lua"]},{"name":"Type","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Type.lua"]},{"name":"Type.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Type.spec.lua"]},{"name":"assertDeepEqual","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assertDeepEqual.lua"]},{"name":"assertDeepEqual.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assertDeepEqual.spec.lua"]},{"name":"assign","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assign.lua"]},{"name":"assign.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assign.spec.lua"]},{"name":"createContext","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createContext.lua"]},{"name":"createContext.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createContext.spec.lua"]},{"name":"createElement","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createElement.lua"]},{"name":"createElement.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createElement.spec.lua"]},{"name":"createFragment","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createFragment.lua"]},{"name":"createFragment.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createFragment.spec.lua"]},{"name":"createReconciler","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconciler.lua"]},{"name":"createReconciler.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconciler.spec.lua"]},{"name":"createReconcilerCompat","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconcilerCompat.lua"]},{"name":"createReconcilerCompat.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconcilerCompat.spec.lua"]},{"name":"createRef","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createRef.lua"]},{"name":"createRef.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createRef.spec.lua"]},{"name":"createSignal","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSignal.lua"]},{"name":"createSignal.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSignal.spec.lua"]},{"name":"createSpy","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSpy.lua"]},{"name":"createSpy.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSpy.spec.lua"]},{"name":"forwardRef","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\forwardRef.lua"]},{"name":"forwardRef.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\forwardRef.spec.lua"]},{"name":"getDefaultInstanceProperty","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\getDefaultInstanceProperty.lua"]},{"name":"getDefaultInstanceProperty.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\getDefaultInstanceProperty.spec.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\init.spec.lua"]},{"name":"internalAssert","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\internalAssert.lua"]},{"name":"invalidSetStateMessages","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\invalidSetStateMessages.lua"]},{"name":"oneChild","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\oneChild.lua"]},{"name":"oneChild.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\oneChild.spec.lua"]},{"name":"strict","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\strict.lua"]},{"name":"strict.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\strict.spec.lua"]}]}]}]},{"name":"synthetic","className":"ModuleScript","filePaths":["src\\init.luau"],"children":[{"name":"Component","className":"Folder","children":[{"name":"Button","className":"Folder","children":[{"name":"TextButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\TextButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\TextButton\\cfusion.story.luau"]}]}]}]},{"name":"Config","className":"ModuleScript","filePaths":["src\\Config.luau"]},{"name":"DropShadow","className":"ModuleScript","filePaths":["src\\DropShadow\\init.luau"]},{"name":"Enums","className":"ModuleScript","filePaths":["src\\Enums.luau"]},{"name":"Sounds","className":"ModuleScript","filePaths":["src\\Sounds.luau"]},{"name":"Test","className":"Folder","children":[{"name":"Source.cfusion","className":"ModuleScript","filePaths":["src\\Test\\Source.cfusion.luau"]}]},{"name":"Types","className":"ModuleScript","filePaths":["src\\Types.luau"]},{"name":"Util","className":"ModuleScript","filePaths":["src\\Util.luau"]}]}]}]}]} \ No newline at end of file diff --git a/src/Component/Button/TextButton/cfusion.story.luau b/src/Component/Button/TextButton/cfusion.story.luau new file mode 100644 index 00000000..723c0da2 --- /dev/null +++ b/src/Component/Button/TextButton/cfusion.story.luau @@ -0,0 +1,128 @@ +--!strict +local _Package = script.Parent.Parent.Parent.Parent +local _Packages = _Package.Parent +-- Services +-- Packages +local Maid = require(_Packages:WaitForChild("Maid")) +local MaterialIcons = require(_Packages:WaitForChild("MaterialIcons")) + +-- Modules +local Types = require(_Package:WaitForChild("Types")) +-- Types +-- Constants +local SCALE = 1 +-- Variables +-- References +local Icons = MaterialIcons.default.dp_48.scale_1 + +-- Class +return function(frame: Frame) + local maid = Maid.new() + task.spawn(function() + local function makeHalfFrame( + isDarkMode: boolean, + color: Color3 + ): Frame + + local halfFrame = maid:GiveTask(Instance.new("Frame")) + halfFrame.BackgroundColor3 = if isDarkMode then Color3.new(0.15,0.15,0.15) else Color3.new(0.85, 0.85, 0.85) + + local listLayout = maid:GiveTask(Instance.new("UIListLayout")) + listLayout.FillDirection = Enum.FillDirection.Vertical + listLayout.Padding = UDim.new(0, 10) + listLayout.VerticalAlignment = Enum.VerticalAlignment.Center + listLayout.HorizontalAlignment = Enum.HorizontalAlignment.Center + listLayout.Parent = halfFrame + + local Module = require(script.Parent) + local theme = Types.newThemeData( + 1, + false, + SCALE, + Font.fromEnum(Enum.Font.SourceSans), + color, + halfFrame.BackgroundColor3 + ) + + do + local button = maid:GiveTask(Module.cfusion( + function() + print("click") + end, + "Button", + theme, + nil, + nil + )) + button.Parent = halfFrame + end + + do + local button = maid:GiveTask(Module.cfusion( + function() + print("click") + end, + "Disabled", + theme, + nil, + false + )) + button.Parent = halfFrame + end + + do + local button = maid:GiveTask(Module.cfusion( + function() + print("click") + end, + "Icon", + theme, + Types.newImageData( + Icons.voice_chat.Image, + Icons.voice_chat.ImageRectOffset, + Icons.voice_chat.ImageRectSize + ), + true + )) + button.Parent = halfFrame + end + + return halfFrame + end + + local COLORS: {[number]: Color3} = { + Color3.fromHSV(0, 0.9, 0.8), + Color3.fromHSV(0, 0.25, 0.8), + Color3.fromHSV(0, 0.9, 0.5), + Color3.fromHSV(0.6, 0.9, 0.7), + Color3.fromHSV(0.35, 0.9, 0.7), + Color3.fromHSV(0.1, 0.9, 0.7), + } + + for i, color in ipairs(COLORS) do + local x = (i-1)/(#COLORS) + local width = 1/(#COLORS) + local dark = makeHalfFrame( + true, + color + ) + + dark.Size = UDim2.fromScale(width, 0.5) + dark.Position = UDim2.fromScale(x, 0.5) + dark.Parent = frame + + local bright = makeHalfFrame( + false, + color + ) + bright.Size = UDim2.fromScale(width, 0.5) + bright.Position = UDim2.fromScale(x, 0) + bright.Parent = frame + + end + + end) + return function() + maid:Destroy() + end +end \ No newline at end of file diff --git a/src/Component/Button/TextButton/init.luau b/src/Component/Button/TextButton/init.luau new file mode 100644 index 00000000..6f181fe7 --- /dev/null +++ b/src/Component/Button/TextButton/init.luau @@ -0,0 +1,375 @@ +--!strict +local _Package = script.Parent.Parent.Parent +local _Packages = _Package.Parent +-- Services +local SoundService = game:GetService("SoundService") + +-- Packages +local Maid = require(_Packages:WaitForChild("Maid")) +local ColdFusion = require(_Packages:WaitForChild("ColdFusion")) +local CurveUtil = require(_Packages:WaitForChild("CurveUtil")) + +-- Modules +local Sounds = require(_Package:WaitForChild("Sounds")) +local Enums = require(_Package:WaitForChild("Enums")) +local Types = require(_Package:WaitForChild("Types")) +local Config = require(_Package:WaitForChild("Config")) +local Util = require(_Package:WaitForChild("Util")) + +-- Types +type Maid = Maid.Maid +type State = ColdFusion.State +type ValueState = ColdFusion.ValueState +type CanBeState = ColdFusion.CanBeState +type TextStyle = Types.TextStyle +type ImageData = Types.ImageData +type ThemeData = Types.ThemeData +-- Constants +local HEIGHT_DP = 40 +local SHAPE_DP = 20 +local ICON_SIZE_DP = 18 +local CONTAINER_WIDTH_MIN_DP = 48 +local LEFT_RIGHT_PADDING_DP = 12 +local LEFT_PADDING_WITH_ICON_DP = 12 +local RIGHT_PADDING_WITH_ICON_DP = 16 +local PADDING_BETWEEN_ELEMENTS_DP = 8 +local DEFAULT_VOLUME = Config.Sound.Volume +local LABEL_TEXT_ALIGNMENT = Enum.TextXAlignment.Center + +-- Variables +-- References +-- Private Functions + + +-- Class +local Interface = {} + +function Interface._new( + maid: Maid, + onClick: CanBeState<() -> ()>, + text: CanBeState, + font: CanBeState, + styles: CanBeState<{[Enums.ButtonStateType]: TextStyle}>, + textIcon: CanBeState, + isEnabled: CanBeState, + scale: CanBeState, + sound: CanBeState +): TextButton + + local _fuse = ColdFusion.fuse(maid) + + local _new = _fuse.new + local _bind = _fuse.bind + local _clone = _fuse.clone + local _import = _fuse.import + + local _Value = _fuse.Value + local _Computed = _fuse.Computed + local isEnabledState = _import(isEnabled, true) + local isFocusedState = _Value(false) + local isPressedState = _Value(false) + local isHoveredState = _Value(false) + local currentStateState = _Computed(function(isEnabled: boolean, isFocused: boolean, isPressed: boolean, isHovered: boolean): Enums.ButtonStateType + if isEnabled then + if isPressed then + return Enums.ButtonStateType.Pressed + else + if isHovered then + return Enums.ButtonStateType.Hovered + else + if isFocused then + return Enums.ButtonStateType.Focused + else + return Enums.ButtonStateType.Enabled + end + end + end + else + return Enums.ButtonStateType.Disabled + end + end, isEnabledState, isFocusedState, isPressedState, isHoveredState) :: State + + local stylesState = _import(styles, {}) :: any + local currentStyleState = _Computed(function(state: Enums.ButtonStateType, styles: {[Enums.ButtonStateType]: TextStyle}): TextStyle + local style = styles[state] + assert(style ~= nil, `no style for {state}`) + return style + end, currentStateState, stylesState) + + local onClickState = _import(onClick, function() end) + local textState = _import(text, "") + local fontState = _import(font, Font.fromEnum(Enum.Font.SourceSansSemibold)) + local scaleState = _import(scale, 1) + local iconState = _import(textIcon, nil :: ImageData?) :: any + local soundState = _import(sound, nil :: Sound?) + local inst: TextButton = _new("TextButton")({ + Name = "TextButton", + Text = "", + BackgroundTransparency = _Computed(function(style: TextStyle): number + return style.BackgroundTransparency + end, currentStyleState), + BackgroundColor3 = _Computed(function(style: TextStyle): Color3 + return style.BackgroundColor3 + end, currentStyleState), + Active = isEnabledState, + AutomaticSize = Enum.AutomaticSize.X, + Size = _Computed(function(s: number): UDim2 + return UDim2.fromOffset(0, s * HEIGHT_DP) + end, scaleState), + Events = { + Activated = function() + if isEnabledState:Get() == false then return end + local click = onClickState:Get() + local s = soundState:Get() + if s then + SoundService:PlayLocalSound(s) + end + click() + end, + MouseButton1Down = function(inputObject: InputObject) + isPressedState:Set(true) + end, + MouseButton1Up = function(inputObject: InputObject) + isPressedState:Set(false) + end, + MouseEnter = function() + isHoveredState:Set(true) + end, + MouseLeave = function() + isHoveredState:Set(false) + end, + SelectionGained = function() + isFocusedState:Set(true) + end, + SelectionLost = function() + isFocusedState:Set(false) + end, + }, + Children = { + _new("UICorner")({ + CornerRadius = _Computed(function(s: number): UDim + return UDim.new(0, s * SHAPE_DP) + end, scaleState), + }), + _new("UIListLayout")({ + Padding = _Computed(function(s: number): UDim + return UDim.new(0, s * PADDING_BETWEEN_ELEMENTS_DP) + end, scaleState), + SortOrder = Enum.SortOrder.LayoutOrder, + FillDirection = Enum.FillDirection.Horizontal, + ItemLineAlignment = Enum.ItemLineAlignment.Center, + VerticalAlignment = Enum.VerticalAlignment.Center, + HorizontalAlignment = Enum.HorizontalAlignment.Center, + }), + _new("TextLabel")({ + Text = textState, + TextScaled = true, + TextXAlignment = LABEL_TEXT_ALIGNMENT, + TextYAlignment = Enum.TextYAlignment.Center, + BackgroundTransparency = 1, + AutomaticSize = Enum.AutomaticSize.X, + FontFace = fontState, + LayoutOrder = 2, + TextColor3 = _Computed(function(style: TextStyle): Color3 + return style.TextColor3 + end, currentStyleState), + TextTransparency = _Computed(function(style: TextStyle): number + return style.TextTransparency + end, currentStyleState), + Size = _Computed(function(s: number): UDim2 + return UDim2.fromOffset(0, s * ICON_SIZE_DP) + end, scaleState), + }), + _new("ImageLabel")({ + Name = "Icon", + LayoutOrder = 1, + BackgroundTransparency = 1, + Visible = _Computed(function(icon: ImageData?): boolean + return icon ~= nil + end, iconState), + Image = _Computed(function(icon: ImageData?): string + return if icon then icon.Image else "" + end, iconState), + ImageColor3 = _Computed(function(icon: ImageData?, style: TextStyle?): Color3 + return if icon and style then style.TextColor3 else Color3.new(1,1,1) + end, iconState, currentStyleState), + ImageRectOffset = _Computed(function(icon: ImageData?): Vector2 + return if icon then icon.RectOffset else Vector2.zero + end, iconState), + ImageRectSize = _Computed(function(icon: ImageData?): Vector2 + return if icon then icon.RectSize else Vector2.zero + end, iconState), + ImageTransparency = _Computed(function(icon: ImageData?, style: TextStyle?): number + return if icon and style then style.TextTransparency else 1 + end, iconState, currentStyleState), + Size = _Computed(function(s: number): UDim2 + return UDim2.fromOffset(s * ICON_SIZE_DP, s * ICON_SIZE_DP) + end, scaleState), + }), + _new("UIPadding")({ + PaddingLeft = _Computed(function(s: number, icon: ImageData?): UDim + if icon then + return UDim.new(0, LEFT_PADDING_WITH_ICON_DP * s) + else + return UDim.new(0, LEFT_RIGHT_PADDING_DP * s) + end + end, scaleState, iconState), + PaddingRight = _Computed(function(s: number, icon: ImageData?): UDim + if icon then + return UDim.new(0, RIGHT_PADDING_WITH_ICON_DP * s) + else + return UDim.new(0, LEFT_RIGHT_PADDING_DP * s) + end + end, scaleState, iconState), + PaddingTop = _Computed(function(s: number): UDim + return UDim.new(0, s * (HEIGHT_DP-ICON_SIZE_DP) / 2) + end, scaleState), + PaddingBottom = _Computed(function(s: number): UDim + return UDim.new(0, s * (HEIGHT_DP-ICON_SIZE_DP) / 2) + end, scaleState), + }), + _new("UISizeConstraint")({ + MaxSize = Vector2.new(math.huge, math.huge), + MinSize = _Computed(function(s: number): Vector2 + return Vector2.new(s * CONTAINER_WIDTH_MIN_DP, 0) + end, scaleState), + }), + }, + }) :: TextButton + + return inst +end + +function Interface.cfusion( + onClick: CanBeState<() -> ()>, + text: CanBeState, + theme: CanBeState, + icon: CanBeState?, + isEnabled: CanBeState? +): TextButton + local maid = Maid.new() + + local _fuse = ColdFusion.fuse(maid) + + local _new = _fuse.new + local _bind = _fuse.bind + local _clone = _fuse.clone + local _import = _fuse.import + + local _Value = _fuse.Value + local _Computed = _fuse.Computed + + local onClickState = _import(onClick, function() end) + local textState = _import(text, "") + local themeState = _import(theme, Types.newThemeData( + 1, + false, + 1, + Font.fromEnum(Enum.Font.SourceSansSemibold), + Color3.fromHSV(0.8, 0.4, 0.8) + )) + + local sound = maid:GiveTask(Instance.new("Sound")) + sound.Volume = DEFAULT_VOLUME + sound.SoundId = Sounds.ui_tap_variant_01 + + local styles = _Computed(function(thm: ThemeData): {[Enums.ButtonStateType]: TextStyle} + local textColor: Color3? + if thm.IsDarkMode then + textColor = Util.getReadableColor( + thm.Color3, + if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.DARK_SURFACE, + 12 + ) + else + textColor = Util.getReadableColor( + thm.Color3, + if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.LIGHT_SURFACE, + 5 + ) + end + assert(textColor) + textColor = Util.getElevatedColor( + textColor, + thm.Elevation, + thm.IsDarkMode + ) + local data = { + [Enums.ButtonStateType.Enabled] = Types.newTextStyle( + textColor, + 0, + textColor, + 1, + textColor, + 1 + ), + [Enums.ButtonStateType.Disabled] = Types.newTextStyle( + (function(): Color3 + if thm.IsDarkMode then + local h,_s,v = textColor:ToHSV() + return Util.getReadableColor( + Color3.fromHSV(h,0,v), + if thm.BackgroundColor3 then thm.BackgroundColor3 else Color3.new(0.15,0.15,0.15) + ) + else + local h,_s,v = textColor:ToHSV() + return Util.getReadableColor( + Color3.fromHSV(h,0,v), + if thm.BackgroundColor3 then thm.BackgroundColor3 else Color3.new(0.85,0.85,0.85) + ) + end + end)(), + 0.4, + textColor, + 1, + textColor, + 1 + ), + [Enums.ButtonStateType.Focused] = Types.newTextStyle( + textColor, + 0, + textColor, + 0.45, + textColor, + 1 + ), + [Enums.ButtonStateType.Hovered] = Types.newTextStyle( + textColor, + 0, + textColor, + 0.85, + textColor, + 1 + ), + [Enums.ButtonStateType.Pressed] = Types.newTextStyle( + textColor, + 0, + textColor, + 0.6, + textColor, + 1 + ), + } + return data + end, themeState) + + local button = Interface._new( + maid, + onClickState, + textState, + _Computed(function(t: ThemeData): Font + return t.Font + end, themeState), + styles, + icon, + if isEnabled == nil then true else isEnabled, + _Computed(function(t: ThemeData): number + return t.Scale + end, themeState), + sound + ) + maid.bind(button) + return button +end + +return Interface \ No newline at end of file diff --git a/src/Test/init.luau b/src/Config.luau similarity index 63% rename from src/Test/init.luau rename to src/Config.luau index 6f70e623..d3a89166 100644 --- a/src/Test/init.luau +++ b/src/Config.luau @@ -1,6 +1,4 @@ --!strict -local _Package = script -local _Packages = _Package.Parent -- Services -- Packages -- Modules @@ -9,4 +7,9 @@ local _Packages = _Package.Parent -- Variables -- References -- Private Functions --- Class \ No newline at end of file +-- Class +return { + Sound = { + Volume = 1, + } +} \ No newline at end of file diff --git a/src/DropShadow/init.luau b/src/DropShadow/init.luau new file mode 100644 index 00000000..ebb6afd5 --- /dev/null +++ b/src/DropShadow/init.luau @@ -0,0 +1,55 @@ +--!strict +local _Package = script.Parent +local _Packages = _Package.Parent +-- Services +-- Packages +local Maid = require(_Packages:WaitForChild("Maid")) +local ColdFusion = require(_Packages:WaitForChild("ColdFusion")) + +-- Modules +-- Types +-- Constants +local IMAGE_SIZE = 500 +local HALF_IMAGE_SIZE = IMAGE_SIZE/2 +-- Variables +-- References +-- Private Functions +-- Class +-- Types +type CanBeState = ColdFusion.CanBeState +type ValueState = ColdFusion.ValueState +type State = ColdFusion.State +type Maid = Maid.Maid + + +return function(cornerRadius: CanBeState, transparency: CanBeState): ImageLabel + local maid = Maid.new() + + local _fuse = ColdFusion.fuse(maid) + + local _new = _fuse.new + local _bind = _fuse.bind + local _clone = _fuse.clone + local _import = _fuse.import + + local _Value = _fuse.Value + local _Computed = _fuse.Computed + + local cornerRadiusState = _import(cornerRadius, 1) + + local inst = _new("ImageLabel")({ + Image = "rbxassetid://15549395120", + ImageColor3 = Color3.new(0,0,0), + BackgroundTransparency = 1, + ImageTransparency = transparency, + ScaleType = Enum.ScaleType.Slice, + SliceCenter = Rect.new(HALF_IMAGE_SIZE, HALF_IMAGE_SIZE, HALF_IMAGE_SIZE, HALF_IMAGE_SIZE), + SliceScale = _Computed(function(radius: number): number + return math.clamp(radius/HALF_IMAGE_SIZE, 0, 1) + end, cornerRadiusState), + }) :: ImageLabel + + maid.bind(inst) + + return inst +end \ No newline at end of file diff --git a/src/Enums.luau b/src/Enums.luau new file mode 100644 index 00000000..e8356b24 --- /dev/null +++ b/src/Enums.luau @@ -0,0 +1,49 @@ +--strict +-- this script was generated by nightcycle/pseudo-enum, do not manually edit + +export type ButtonStateType = "Enabled" + | "Disabled" + | "Hovered" + | "Focused" + | "Pressed" + +local ButtonStateTypeList = { "Enabled", "Disabled", "Hovered", "Focused", "Pressed" } +export type EnumName = "ButtonStateType" +return { + getEnumItems = function(enumName: EnumName): { [number]: string } + if enumName == "ButtonStateType" then + return table.clone(ButtonStateTypeList) + end + error("bad enum name: " .. tostring(enumName)) + end, + getEnumItemFromValue = function(enumName: EnumName, value: number): string + if enumName == "ButtonStateType" then + if ButtonStateTypeList[value] then + return ButtonStateTypeList[value] + else + error("no enum item of value " .. tostring(value) .. " in enum " .. tostring(enumName)) + end + end + error("bad enum name: " .. tostring(enumName)) + end, + + getValueFromEnumItem = function(enumName: EnumName, enumItem: string): number + if enumName == "ButtonStateType" then + local index = table.find(ButtonStateTypeList, enumItem) + if index then + assert(index) + return index + else + error("no enumItem " .. enumItem .. " in ButtonStateType") + end + end + error("bad enum name: " .. tostring(enumName)) + end, + ButtonStateType = { + ["Enabled"] = "Enabled", + ["Disabled"] = "Disabled", + ["Hovered"] = "Hovered", + ["Focused"] = "Focused", + ["Pressed"] = "Pressed", + }, +} diff --git a/src/Types.luau b/src/Types.luau new file mode 100644 index 00000000..8628f13c --- /dev/null +++ b/src/Types.luau @@ -0,0 +1,98 @@ +--!strict +-- Services +-- Packages +-- Modules +-- Types +export type ThemeData = { + Elevation: number, + IsDarkMode: boolean, + Color3: Color3, + Font: Font, + BackgroundColor3: Color3?, + Scale: number +} +export type ImageData = { + Image: string, + RectOffset: Vector2, + RectSize: Vector2 +} +export type Style = { + BorderColor3: Color3, + BorderTransparency: number, + BackgroundColor3: Color3, + BackgroundTransparency: number +} +export type TextStyle = { + TextColor3: Color3, + TextTransparency: number +} & Style +-- Constants +-- Variables +-- References +-- Private Functions +-- Class +local Types = {} + +function Types.newImageData( + image: string, + offset: Vector2?, + size: Vector2? +): ImageData + return { + Image = image, + RectOffset = offset or Vector2.zero, + RectSize = size or Vector2.zero + } +end + +function Types.newStyle( + backgroundColor3: Color3, + backgroundTransparency: number, + borderColor3: Color3, + borderTransparency: number +): Style + return { + BackgroundColor3 = backgroundColor3, + BackgroundTransparency = backgroundTransparency, + BorderColor3 = borderColor3, + BorderTransparency = borderTransparency, + } +end + +function Types.newTextStyle( + textColor3: Color3, + textTransparency: number, + backgroundColor: Color3, + backgroundTransparency: number, + borderColor3: Color3, + borderTransparency: number +): TextStyle + return { + TextColor3 = textColor3, + TextTransparency = textTransparency, + BackgroundColor3 = backgroundColor, + BackgroundTransparency = backgroundTransparency, + BorderColor3 = borderColor3, + BorderTransparency = borderTransparency, + } +end + +function Types.newThemeData( + elevation: number, + isDarkMode: boolean, + scale: number, + font: Font, + color3: Color3, + backgroundColor3: Color3? +): ThemeData + return { + Color3 = color3, + BackgroundColor3 = backgroundColor3, + Elevation = elevation, + IsDarkMode = isDarkMode, + Font = font, + Scale = scale + } +end + +return Types \ No newline at end of file diff --git a/src/Util.luau b/src/Util.luau new file mode 100644 index 00000000..983247a8 --- /dev/null +++ b/src/Util.luau @@ -0,0 +1,171 @@ +--!strict +local _Package = script.Parent +local _Packages = _Package.Parent +-- Services +-- Packages +local CurveUtil = require(_Packages:WaitForChild("CurveUtil")) +-- Modules +-- Types +-- Constants +local LUM_LIMIT = 0.03928 +local LUM_DENOM = 12.92 +local LUM_OFFSET = 0.055 +local LUM_OFFSET_DENOM = 1.055 +local R_WEIGHT = 0.2126 +local G_WEIGHT = 0.7152 +local B_WEIGHT = 0.0722 +local L_EXP = 2.4 +local MIN_HEX_DIFFERENCE = 100 / 255 +local DEFAULT_CONTRAST_RATIO = 4.5 +local BLACK_COLOR = Color3.new(0,0,0) +local WHITE_COLOR = Color3.new(1,1,1) +local MAX_ELEVATION = 16 +-- Variables +-- References +-- Private Functions + +function getContrastRatio(textColor3: Color3, backgroundColor3: Color3): number + local function getRelativeLuminance(color: Color3): number + local function solveSpace(v: number): number + if v < LUM_LIMIT then + return v / LUM_DENOM + else + return ((v + LUM_OFFSET) / LUM_OFFSET_DENOM) ^ L_EXP + end + end + return R_WEIGHT * solveSpace(color.R) + G_WEIGHT * solveSpace(color.G) + B_WEIGHT * solveSpace(color.B) + end + + local _fH, _fS, fV = textColor3:ToHSV() + local _bH, _bS, bV = backgroundColor3:ToHSV() + + local fLum = getRelativeLuminance(textColor3) + local bLum = getRelativeLuminance(backgroundColor3) + + local lighterRelativeLuminance: number + local darkerRelativeLuminance: number + if fV < bV then + lighterRelativeLuminance = bLum + darkerRelativeLuminance = fLum + else + lighterRelativeLuminance = fLum + darkerRelativeLuminance = bLum + end + + return (lighterRelativeLuminance + 0.05) / (darkerRelativeLuminance + 0.05) +end + +-- Class +local Util = {} + +Util.DARK_SURFACE = Color3.new(0.15,0.15,0.15) +Util.LIGHT_SURFACE = Color3.new(0.85,0.85,0.85) + +function Util.getIfReadable( + textColor3: Color3, + backgroundColor3: Color3, + minConstrastRatio: number? +): boolean + minConstrastRatio = minConstrastRatio or DEFAULT_CONTRAST_RATIO + assert(minConstrastRatio) + local ratio = getContrastRatio(textColor3, backgroundColor3) + return ratio >= minConstrastRatio +end + +-- https://github.com/alex-page/a11ycolor/blob/main/index.js +function Util.getReadableColor( + textColor3: Color3, + backgroundColor3: Color3, + minConstrastRatio: number? +): Color3 + minConstrastRatio = minConstrastRatio or DEFAULT_CONTRAST_RATIO + assert(minConstrastRatio) + + + -- Check the ratio straight away, if it passes return the value as hex + if Util.getIfReadable(textColor3, backgroundColor3, minConstrastRatio) then + return textColor3 + end + + -- Ratio didn't pass so we need to find the nearest color + local isBlackContrast = Util.getIfReadable(BLACK_COLOR, backgroundColor3, minConstrastRatio) + local isWhiteContrast = Util.getIfReadable(WHITE_COLOR, backgroundColor3, minConstrastRatio) + + local cH, cS, cV = textColor3:ToHSV() + local minValue = 0 + local maxValue = 1 + local isDarkColor = false + + -- If black and white both pass on the background + if isBlackContrast and isWhiteContrast then + -- Change the min lightness if the color is light + if cV >= 0.5 then + minValue = cV + else -- Change the max lightness if the color is dark + maxValue = cV + isDarkColor = true + end + elseif isBlackContrast then -- If our colour passes contrast on black + maxValue = cV + isDarkColor = true + else -- Colour doesn't meet contrast pass on black + minValue = cV + end + + -- The color to return + local finalColor: Color3? + + -- Binary search until we find the colour that meets contrast + local prevColor: Color3? + while not finalColor do + local midValue = (minValue + maxValue) / 2 + local midColor = Color3.fromHSV(cH, cS, midValue) + + if Util.getIfReadable(midColor, backgroundColor3, minConstrastRatio) then + if maxValue - minValue <= MIN_HEX_DIFFERENCE then + finalColor = midColor + elseif isDarkColor then + minValue = midValue + else + maxValue = midValue + end + elseif isDarkColor then + maxValue = midValue + else + minValue = midValue + end + + if prevColor == midColor then + break + end + + prevColor = midColor + end + + return finalColor or textColor3 +end + +function Util.getElevatedColor(color: Color3, elevation: number, isDarkMode: boolean): Color3 + elevation = math.clamp(elevation, 0, MAX_ELEVATION) + local alpha = 1- CurveUtil.ease( + elevation / MAX_ELEVATION, + Enum.EasingStyle.Quad, + Enum.EasingDirection.In + ) + + if isDarkMode then + return CurveUtil.lerp( + color, + Color3.new(1,1,1), + alpha*0.1 + ) + else + return CurveUtil.lerp( + color, + Color3.new(1,1,1), + alpha*0.25 + ) + end +end + +return Util \ No newline at end of file diff --git a/synthetic.rbxl.lock b/synthetic.rbxl.lock new file mode 100644 index 00000000..e383dff5 --- /dev/null +++ b/synthetic.rbxl.lock @@ -0,0 +1,5 @@ +10340 +RobloxStudioBeta +DESKTOP-UIAPQFM +faf3918c-cd67-4e9b-95e8-76107b83bc31 + diff --git a/wally.lock b/wally.lock index f581f258..d30660d8 100644 --- a/wally.lock +++ b/wally.lock @@ -2,11 +2,21 @@ # It is not intended for manual editing. registry = "test" +[[package]] +name = "elttob/fusion" +version = "0.2.0" +dependencies = [] + [[package]] name = "nightcycle/cold-fusion" version = "9.0.7" dependencies = [["Maid", "nightcycle/maid@1.1.4"], ["ServiceProxy", "nightcycle/service-proxy@1.0.0"], ["Signal", "nightcycle/signal@1.0.2"], ["TableUtil", "nightcycle/table-util@1.1.0"]] +[[package]] +name = "nightcycle/curve-util" +version = "1.0.0" +dependencies = [["Vector", "nightcycle/vector@1.0.2"]] + [[package]] name = "nightcycle/format" version = "0.1.3" @@ -22,6 +32,11 @@ name = "nightcycle/maid" version = "1.1.4" dependencies = [] +[[package]] +name = "nightcycle/material-icons" +version = "1.0.1" +dependencies = [] + [[package]] name = "nightcycle/mesh-util" version = "1.0.3" @@ -45,9 +60,19 @@ dependencies = [] [[package]] name = "nightcycle/synthetic" version = "5.0.0" -dependencies = [["ColdFusion", "nightcycle/cold-fusion@9.0.7"], ["Format", "nightcycle/format@0.1.3"], ["Maid", "nightcycle/maid@1.1.4"], ["MeshUtil", "nightcycle/mesh-util@1.0.3"], ["Signal", "nightcycle/signal@1.0.2"]] +dependencies = [["ColdFusion", "nightcycle/cold-fusion@9.0.7"], ["CurveUtil", "nightcycle/curve-util@1.0.0"], ["Format", "nightcycle/format@0.1.3"], ["Fusion", "elttob/fusion@0.2.0"], ["Maid", "nightcycle/maid@1.1.4"], ["MaterialIcons", "nightcycle/material-icons@1.0.1"], ["MeshUtil", "nightcycle/mesh-util@1.0.3"], ["Roact", "roblox/roact@1.4.4"], ["Signal", "nightcycle/signal@1.0.2"]] [[package]] name = "nightcycle/table-util" version = "1.1.0" dependencies = [] + +[[package]] +name = "nightcycle/vector" +version = "1.0.2" +dependencies = [] + +[[package]] +name = "roblox/roact" +version = "1.4.4" +dependencies = [] diff --git a/wally.toml b/wally.toml index 35791ab6..7e5d4bf3 100644 --- a/wally.toml +++ b/wally.toml @@ -13,3 +13,7 @@ Signal = "nightcycle/signal@1.0.2" Maid = "nightcycle/maid@1.1.4" Format = "nightcycle/format@0.1.3" MeshUtil = "nightcycle/mesh-util@1.0.3" +Fusion = "elttob/fusion@0.2.0" +Roact = "roblox/roact@1.4.0" +MaterialIcons = "nightcycle/material-icons@1.0.1" +CurveUtil = "nightcycle/curve-util@1.0.0" \ No newline at end of file From 829624ca36a3cac33bb38a3ed0c5ae1d98ff8410 Mon Sep 17 00:00:00 2001 From: Nightcycle <77173389+nightcycle@users.noreply.github.com> Date: Tue, 5 Dec 2023 17:13:41 -0500 Subject: [PATCH 04/57] Added outlined button --- sourcemap.json | 2 +- src/Component/Button/Base.luau | 243 ++++++++++++++++++ .../Button/OutlinedButton/cfusion.story.luau | 128 +++++++++ src/Component/Button/OutlinedButton/init.luau | 177 +++++++++++++ src/Component/Button/TextButton/init.luau | 222 +--------------- src/Config.luau | 10 + 6 files changed, 569 insertions(+), 213 deletions(-) create mode 100644 src/Component/Button/Base.luau create mode 100644 src/Component/Button/OutlinedButton/cfusion.story.luau create mode 100644 src/Component/Button/OutlinedButton/init.luau diff --git a/sourcemap.json b/sourcemap.json index 84068a39..74d3b556 100644 --- a/sourcemap.json +++ b/sourcemap.json @@ -1 +1 @@ -{"name":"synthetic-test","className":"DataModel","filePaths":["dev.project.json"],"children":[{"name":"ReplicatedStorage","className":"ReplicatedStorage","children":[{"name":"Packages","className":"Folder","children":[{"name":"ColdFusion","className":"ModuleScript","filePaths":["Packages\\ColdFusion.lua"]},{"name":"CurveUtil","className":"ModuleScript","filePaths":["Packages\\CurveUtil.lua"]},{"name":"Format","className":"ModuleScript","filePaths":["Packages\\Format.lua"]},{"name":"Fusion","className":"ModuleScript","filePaths":["Packages\\Fusion.lua"]},{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\Maid.lua"]},{"name":"MaterialIcons","className":"ModuleScript","filePaths":["Packages\\MaterialIcons.lua"]},{"name":"MeshUtil","className":"ModuleScript","filePaths":["Packages\\MeshUtil.lua"]},{"name":"Roact","className":"ModuleScript","filePaths":["Packages\\Roact.lua"]},{"name":"Signal","className":"ModuleScript","filePaths":["Packages\\Signal.lua"]},{"name":"_Index","className":"Folder","children":[{"name":"elttob_fusion@0.2.0","className":"Folder","children":[{"name":"fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\init.lua","Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\default.project.json"],"children":[{"name":"Animation","className":"Folder","children":[{"name":"Spring","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\Spring.lua"]},{"name":"SpringScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\SpringScheduler.lua"]},{"name":"Tween","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\Tween.lua"]},{"name":"TweenScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\TweenScheduler.lua"]},{"name":"getTweenRatio","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\getTweenRatio.lua"]},{"name":"lerpType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\lerpType.lua"]},{"name":"packType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\packType.lua"]},{"name":"springCoefficients","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\springCoefficients.lua"]},{"name":"unpackType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\unpackType.lua"]}]},{"name":"Colour","className":"Folder","children":[{"name":"Oklab","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Colour\\Oklab.lua"]}]},{"name":"Dependencies","className":"Folder","children":[{"name":"captureDependencies","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\captureDependencies.lua"]},{"name":"initDependency","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\initDependency.lua"]},{"name":"sharedState","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\sharedState.lua"]},{"name":"updateAll","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\updateAll.lua"]},{"name":"useDependency","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\useDependency.lua"]}]},{"name":"Instances","className":"Folder","children":[{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Children.lua"]},{"name":"Cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Cleanup.lua"]},{"name":"Hydrate","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Hydrate.lua"]},{"name":"New","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\New.lua"]},{"name":"OnChange","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\OnChange.lua"]},{"name":"OnEvent","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\OnEvent.lua"]},{"name":"Out","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Out.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Ref.lua"]},{"name":"applyInstanceProps","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\applyInstanceProps.lua"]},{"name":"defaultProps","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\defaultProps.lua"]}]},{"name":"Logging","className":"Folder","children":[{"name":"logError","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logError.lua"]},{"name":"logErrorNonFatal","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logErrorNonFatal.lua"]},{"name":"logWarn","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logWarn.lua"]},{"name":"messages","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\messages.lua"]},{"name":"parseError","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\parseError.lua"]}]},{"name":"PubTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\PubTypes.lua"]},{"name":"State","className":"Folder","children":[{"name":"Computed","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Computed.lua"]},{"name":"ForKeys","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForKeys.lua"]},{"name":"ForPairs","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForPairs.lua"]},{"name":"ForValues","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForValues.lua"]},{"name":"Observer","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Observer.lua"]},{"name":"Value","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Value.lua"]},{"name":"unwrap","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\unwrap.lua"]}]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Types.lua"]},{"name":"Utility","className":"Folder","children":[{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\None.lua"]},{"name":"cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\cleanup.lua"]},{"name":"doNothing","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\doNothing.lua"]},{"name":"isSimilar","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\isSimilar.lua"]},{"name":"needsDestruction","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\needsDestruction.lua"]},{"name":"restrictRead","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\restrictRead.lua"]},{"name":"xtypeof","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\xtypeof.lua"]}]}]}]},{"name":"nightcycle_cold-fusion@9.0.7","className":"Folder","children":[{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\Maid.lua"]},{"name":"ServiceProxy","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\ServiceProxy.lua"]},{"name":"Signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\Signal.lua"]},{"name":"TableUtil","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\TableUtil.lua"]},{"name":"cold-fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\init.luau","Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\default.project.json"],"children":[{"name":"Fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\init.lua"],"children":[{"name":"Animation","className":"Folder","children":[{"name":"Spring","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\Spring.lua"]},{"name":"SpringScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\SpringScheduler.lua"]},{"name":"Tween","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\Tween.lua"]},{"name":"TweenScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\TweenScheduler.lua"]},{"name":"getTweenRatio","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\getTweenRatio.lua"]},{"name":"lerpType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\lerpType.lua"]},{"name":"packType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\packType.lua"]},{"name":"springCoefficients","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\springCoefficients.lua"]},{"name":"unpackType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\unpackType.lua"]}]},{"name":"Colour","className":"Folder","children":[{"name":"Oklab","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Colour\\Oklab.lua"]}]},{"name":"Instances","className":"Folder","children":[{"name":"Attribute","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Attribute.lua"]},{"name":"AttributeChange","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\AttributeChange.lua"]},{"name":"AttributeOut","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\AttributeOut.lua"]},{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Children.lua"]},{"name":"Cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Cleanup.lua"]},{"name":"Hydrate","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Hydrate.lua"]},{"name":"New","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\New.lua"]},{"name":"OnChange","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\OnChange.lua"]},{"name":"OnEvent","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\OnEvent.lua"]},{"name":"Out","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Out.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Ref.lua"]},{"name":"applyInstanceProps","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\applyInstanceProps.lua"]},{"name":"defaultProps","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\defaultProps.lua"]}]},{"name":"Logging","className":"Folder","children":[{"name":"logError","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logError.lua"]},{"name":"logErrorNonFatal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logErrorNonFatal.lua"]},{"name":"logWarn","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logWarn.lua"]},{"name":"messages","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\messages.lua"]},{"name":"parseError","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\parseError.lua"]}]},{"name":"PubTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\PubTypes.lua"]},{"name":"State","className":"Folder","children":[{"name":"Computed","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Computed.lua"]},{"name":"ForKeys","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForKeys.lua"]},{"name":"ForPairs","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForPairs.lua"]},{"name":"ForValues","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForValues.lua"]},{"name":"Observer","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Observer.lua"]},{"name":"Value","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Value.lua"]},{"name":"isState","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\isState.lua"]},{"name":"makeUseCallback","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\makeUseCallback.lua"]},{"name":"peek","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\peek.lua"]},{"name":"updateAll","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\updateAll.lua"]}]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Types.lua"]},{"name":"Utility","className":"Folder","children":[{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\None.lua"]},{"name":"cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\cleanup.lua"]},{"name":"doNothing","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\doNothing.lua"]},{"name":"isSimilar","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\isSimilar.lua"]},{"name":"needsDestruction","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\needsDestruction.lua"]},{"name":"restrictRead","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\restrictRead.lua"]},{"name":"xtypeof","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\xtypeof.lua"]}]}]},{"name":"InstanceTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\InstanceTypes.luau"]},{"name":"Interface","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Interface.luau"]},{"name":"Test.story","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Test.story.luau"]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Types.luau"]},{"name":"Util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Util.luau"]}]}]},{"name":"nightcycle_curve-util@1.0.0","className":"Folder","children":[{"name":"Vector","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\Vector.lua"]},{"name":"curve-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\init.lua","Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\default.project.json"],"children":[{"name":"Ease","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\Ease.lua"]},{"name":"Lerp","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\Lerp.lua"]}]}]},{"name":"nightcycle_format@0.1.3","className":"Folder","children":[{"name":"format","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\init.lua","Packages\\_Index\\nightcycle_format@0.1.3\\format\\default.project.json"],"children":[{"name":"Emoji","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\Emoji.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\init.spec.lua"]}]},{"name":"maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\maid.lua"]},{"name":"signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\signal.lua"]},{"name":"string","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\string.lua"]}]},{"name":"nightcycle_geometry-util@1.1.1","className":"Folder","children":[{"name":"geometry-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\init.lua","Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\default.project.json"],"children":[{"name":"Earcut","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\Earcut\\init.lua"],"children":[{"name":"ZeroArray","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\Earcut\\ZeroArray.lua"]}]}]}]},{"name":"nightcycle_maid@1.1.4","className":"Folder","children":[{"name":"maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\init.lua","Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\default.project.json"],"children":[{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\Maid.lua"]},{"name":"MaidTaskUtils","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\MaidTaskUtils.lua"]}]}]},{"name":"nightcycle_material-icons@1.0.1","className":"Folder","children":[{"name":"material-icons","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\init.luau","Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\default.project.json"],"children":[{"name":"Default_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_1.luau"]},{"name":"Default_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_2.luau"]},{"name":"Default_18_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_3.luau"]},{"name":"Default_18_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_4.luau"]},{"name":"Default_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_1.luau"]},{"name":"Default_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_2.luau"]},{"name":"Default_24_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_3.luau"]},{"name":"Default_24_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_4.luau"]},{"name":"Default_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_1.luau"]},{"name":"Default_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_2.luau"]},{"name":"Default_36_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_3.luau"]},{"name":"Default_36_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_4.luau"]},{"name":"Default_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_1.luau"]},{"name":"Default_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_2.luau"]},{"name":"Default_48_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_3.luau"]},{"name":"Default_48_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_4.luau"]},{"name":"Outlined_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_18_1.luau"]},{"name":"Outlined_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_18_2.luau"]},{"name":"Outlined_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_24_1.luau"]},{"name":"Outlined_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_24_2.luau"]},{"name":"Outlined_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_36_1.luau"]},{"name":"Outlined_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_36_2.luau"]},{"name":"Outlined_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_48_1.luau"]},{"name":"Outlined_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_48_2.luau"]},{"name":"Round_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_18_1.luau"]},{"name":"Round_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_18_2.luau"]},{"name":"Round_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_24_1.luau"]},{"name":"Round_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_24_2.luau"]},{"name":"Round_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_36_1.luau"]},{"name":"Round_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_36_2.luau"]},{"name":"Round_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_48_1.luau"]},{"name":"Round_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_48_2.luau"]},{"name":"Sharp_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_18_1.luau"]},{"name":"Sharp_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_18_2.luau"]},{"name":"Sharp_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_24_1.luau"]},{"name":"Sharp_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_24_2.luau"]},{"name":"Sharp_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_36_1.luau"]},{"name":"Sharp_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_36_2.luau"]},{"name":"Sharp_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_48_1.luau"]},{"name":"Sharp_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_48_2.luau"]},{"name":"TwoTone_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_18_1.luau"]},{"name":"TwoTone_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_18_2.luau"]},{"name":"TwoTone_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_24_1.luau"]},{"name":"TwoTone_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_24_2.luau"]},{"name":"TwoTone_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_36_1.luau"]},{"name":"TwoTone_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_36_2.luau"]},{"name":"TwoTone_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_48_1.luau"]},{"name":"TwoTone_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_48_2.luau"]}]}]},{"name":"nightcycle_mesh-util@1.0.3","className":"Folder","children":[{"name":"GeometryUtil","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\GeometryUtil.lua"]},{"name":"mesh-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\init.lua","Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\default.project.json"],"children":[{"name":"CornerWedgePart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\CornerWedgePart.lua"]},{"name":"Part","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\Part.lua"]},{"name":"TetraPart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\TetraPart.lua"]},{"name":"WedgePart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\WedgePart.lua"]}]}]},{"name":"nightcycle_service-proxy@1.0.0","className":"Folder","children":[{"name":"service-proxy","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_service-proxy@1.0.0\\service-proxy\\src\\init.lua","Packages\\_Index\\nightcycle_service-proxy@1.0.0\\service-proxy\\default.project.json"]}]},{"name":"nightcycle_signal@1.0.2","className":"Folder","children":[{"name":"signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_signal@1.0.2\\signal\\src\\init.lua","Packages\\_Index\\nightcycle_signal@1.0.2\\signal\\default.project.json"]}]},{"name":"nightcycle_string@0.1.0","className":"Folder","children":[{"name":"string","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_string@0.1.0\\string\\src\\init.lua","Packages\\_Index\\nightcycle_string@0.1.0\\string\\default.project.json"],"children":[{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_string@0.1.0\\string\\src\\init.spec.lua"]}]}]},{"name":"nightcycle_table-util@1.1.0","className":"Folder","children":[{"name":"table-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_table-util@1.1.0\\table-util\\src\\init.lua","Packages\\_Index\\nightcycle_table-util@1.1.0\\table-util\\default.project.json"]}]},{"name":"nightcycle_vector@1.0.2","className":"Folder","children":[{"name":"vector","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_vector@1.0.2\\vector\\src\\init.lua","Packages\\_Index\\nightcycle_vector@1.0.2\\vector\\default.project.json"]}]},{"name":"roblox_roact@1.4.4","className":"Folder","children":[{"name":"roact","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\init.lua","Packages\\_Index\\roblox_roact@1.4.4\\roact\\default.project.json"],"children":[{"name":"Binding","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Binding.lua"]},{"name":"Binding.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Binding.spec.lua"]},{"name":"Component","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.lua"]},{"name":"Component.spec","className":"Folder","children":[{"name":"context.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\context.spec.lua"]},{"name":"defaultProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\defaultProps.spec.lua"]},{"name":"didMount.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\didMount.spec.lua"]},{"name":"didUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\didUpdate.spec.lua"]},{"name":"extend.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\extend.spec.lua"]},{"name":"getDerivedStateFromProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\getDerivedStateFromProps.spec.lua"]},{"name":"getElementTraceback.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\getElementTraceback.spec.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\init.spec.lua"]},{"name":"legacyContext.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\legacyContext.spec.lua"]},{"name":"render.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\render.spec.lua"]},{"name":"setState.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\setState.spec.lua"]},{"name":"shouldUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\shouldUpdate.spec.lua"]},{"name":"validateProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\validateProps.spec.lua"]},{"name":"willUnmount.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\willUnmount.spec.lua"]},{"name":"willUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\willUpdate.spec.lua"]}]},{"name":"ComponentLifecyclePhase","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ComponentLifecyclePhase.lua"]},{"name":"Config","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Config.lua"]},{"name":"Config.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Config.spec.lua"]},{"name":"ElementKind","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementKind.lua"]},{"name":"ElementKind.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementKind.spec.lua"]},{"name":"ElementUtils","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementUtils.lua"]},{"name":"ElementUtils.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementUtils.spec.lua"]},{"name":"GlobalConfig","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\GlobalConfig.lua"]},{"name":"GlobalConfig.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\GlobalConfig.spec.lua"]},{"name":"Logging","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Logging.lua"]},{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\None.lua"]},{"name":"NoopRenderer","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\NoopRenderer.lua"]},{"name":"Portal","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Portal.lua"]},{"name":"PropMarkers","className":"Folder","children":[{"name":"Change","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Change.lua"]},{"name":"Change.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Change.spec.lua"]},{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Children.lua"]},{"name":"Event","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Event.lua"]},{"name":"Event.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Event.spec.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Ref.lua"]}]},{"name":"PureComponent","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PureComponent.lua"]},{"name":"PureComponent.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PureComponent.spec.lua"]},{"name":"RobloxRenderer","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\RobloxRenderer.lua"]},{"name":"RobloxRenderer.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\RobloxRenderer.spec.lua"]},{"name":"SingleEventManager","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\SingleEventManager.lua"]},{"name":"SingleEventManager.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\SingleEventManager.spec.lua"]},{"name":"Symbol","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Symbol.lua"]},{"name":"Symbol.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Symbol.spec.lua"]},{"name":"Type","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Type.lua"]},{"name":"Type.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Type.spec.lua"]},{"name":"assertDeepEqual","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assertDeepEqual.lua"]},{"name":"assertDeepEqual.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assertDeepEqual.spec.lua"]},{"name":"assign","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assign.lua"]},{"name":"assign.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assign.spec.lua"]},{"name":"createContext","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createContext.lua"]},{"name":"createContext.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createContext.spec.lua"]},{"name":"createElement","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createElement.lua"]},{"name":"createElement.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createElement.spec.lua"]},{"name":"createFragment","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createFragment.lua"]},{"name":"createFragment.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createFragment.spec.lua"]},{"name":"createReconciler","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconciler.lua"]},{"name":"createReconciler.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconciler.spec.lua"]},{"name":"createReconcilerCompat","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconcilerCompat.lua"]},{"name":"createReconcilerCompat.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconcilerCompat.spec.lua"]},{"name":"createRef","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createRef.lua"]},{"name":"createRef.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createRef.spec.lua"]},{"name":"createSignal","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSignal.lua"]},{"name":"createSignal.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSignal.spec.lua"]},{"name":"createSpy","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSpy.lua"]},{"name":"createSpy.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSpy.spec.lua"]},{"name":"forwardRef","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\forwardRef.lua"]},{"name":"forwardRef.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\forwardRef.spec.lua"]},{"name":"getDefaultInstanceProperty","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\getDefaultInstanceProperty.lua"]},{"name":"getDefaultInstanceProperty.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\getDefaultInstanceProperty.spec.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\init.spec.lua"]},{"name":"internalAssert","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\internalAssert.lua"]},{"name":"invalidSetStateMessages","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\invalidSetStateMessages.lua"]},{"name":"oneChild","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\oneChild.lua"]},{"name":"oneChild.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\oneChild.spec.lua"]},{"name":"strict","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\strict.lua"]},{"name":"strict.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\strict.spec.lua"]}]}]}]},{"name":"synthetic","className":"ModuleScript","filePaths":["src\\init.luau"],"children":[{"name":"Component","className":"Folder","children":[{"name":"Button","className":"Folder","children":[{"name":"TextButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\TextButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\TextButton\\cfusion.story.luau"]}]}]}]},{"name":"Config","className":"ModuleScript","filePaths":["src\\Config.luau"]},{"name":"DropShadow","className":"ModuleScript","filePaths":["src\\DropShadow\\init.luau"]},{"name":"Enums","className":"ModuleScript","filePaths":["src\\Enums.luau"]},{"name":"Sounds","className":"ModuleScript","filePaths":["src\\Sounds.luau"]},{"name":"Test","className":"Folder","children":[{"name":"Source.cfusion","className":"ModuleScript","filePaths":["src\\Test\\Source.cfusion.luau"]}]},{"name":"Types","className":"ModuleScript","filePaths":["src\\Types.luau"]},{"name":"Util","className":"ModuleScript","filePaths":["src\\Util.luau"]}]}]}]}]} \ No newline at end of file +{"name":"synthetic-test","className":"DataModel","filePaths":["dev.project.json"],"children":[{"name":"ReplicatedStorage","className":"ReplicatedStorage","children":[{"name":"Packages","className":"Folder","children":[{"name":"ColdFusion","className":"ModuleScript","filePaths":["Packages\\ColdFusion.lua"]},{"name":"CurveUtil","className":"ModuleScript","filePaths":["Packages\\CurveUtil.lua"]},{"name":"Format","className":"ModuleScript","filePaths":["Packages\\Format.lua"]},{"name":"Fusion","className":"ModuleScript","filePaths":["Packages\\Fusion.lua"]},{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\Maid.lua"]},{"name":"MaterialIcons","className":"ModuleScript","filePaths":["Packages\\MaterialIcons.lua"]},{"name":"MeshUtil","className":"ModuleScript","filePaths":["Packages\\MeshUtil.lua"]},{"name":"Roact","className":"ModuleScript","filePaths":["Packages\\Roact.lua"]},{"name":"Signal","className":"ModuleScript","filePaths":["Packages\\Signal.lua"]},{"name":"_Index","className":"Folder","children":[{"name":"elttob_fusion@0.2.0","className":"Folder","children":[{"name":"fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\init.lua","Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\default.project.json"],"children":[{"name":"Animation","className":"Folder","children":[{"name":"Spring","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\Spring.lua"]},{"name":"SpringScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\SpringScheduler.lua"]},{"name":"Tween","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\Tween.lua"]},{"name":"TweenScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\TweenScheduler.lua"]},{"name":"getTweenRatio","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\getTweenRatio.lua"]},{"name":"lerpType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\lerpType.lua"]},{"name":"packType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\packType.lua"]},{"name":"springCoefficients","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\springCoefficients.lua"]},{"name":"unpackType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\unpackType.lua"]}]},{"name":"Colour","className":"Folder","children":[{"name":"Oklab","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Colour\\Oklab.lua"]}]},{"name":"Dependencies","className":"Folder","children":[{"name":"captureDependencies","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\captureDependencies.lua"]},{"name":"initDependency","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\initDependency.lua"]},{"name":"sharedState","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\sharedState.lua"]},{"name":"updateAll","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\updateAll.lua"]},{"name":"useDependency","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\useDependency.lua"]}]},{"name":"Instances","className":"Folder","children":[{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Children.lua"]},{"name":"Cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Cleanup.lua"]},{"name":"Hydrate","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Hydrate.lua"]},{"name":"New","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\New.lua"]},{"name":"OnChange","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\OnChange.lua"]},{"name":"OnEvent","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\OnEvent.lua"]},{"name":"Out","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Out.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Ref.lua"]},{"name":"applyInstanceProps","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\applyInstanceProps.lua"]},{"name":"defaultProps","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\defaultProps.lua"]}]},{"name":"Logging","className":"Folder","children":[{"name":"logError","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logError.lua"]},{"name":"logErrorNonFatal","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logErrorNonFatal.lua"]},{"name":"logWarn","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logWarn.lua"]},{"name":"messages","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\messages.lua"]},{"name":"parseError","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\parseError.lua"]}]},{"name":"PubTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\PubTypes.lua"]},{"name":"State","className":"Folder","children":[{"name":"Computed","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Computed.lua"]},{"name":"ForKeys","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForKeys.lua"]},{"name":"ForPairs","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForPairs.lua"]},{"name":"ForValues","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForValues.lua"]},{"name":"Observer","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Observer.lua"]},{"name":"Value","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Value.lua"]},{"name":"unwrap","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\unwrap.lua"]}]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Types.lua"]},{"name":"Utility","className":"Folder","children":[{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\None.lua"]},{"name":"cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\cleanup.lua"]},{"name":"doNothing","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\doNothing.lua"]},{"name":"isSimilar","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\isSimilar.lua"]},{"name":"needsDestruction","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\needsDestruction.lua"]},{"name":"restrictRead","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\restrictRead.lua"]},{"name":"xtypeof","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\xtypeof.lua"]}]}]}]},{"name":"nightcycle_cold-fusion@9.0.7","className":"Folder","children":[{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\Maid.lua"]},{"name":"ServiceProxy","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\ServiceProxy.lua"]},{"name":"Signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\Signal.lua"]},{"name":"TableUtil","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\TableUtil.lua"]},{"name":"cold-fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\init.luau","Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\default.project.json"],"children":[{"name":"Fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\init.lua"],"children":[{"name":"Animation","className":"Folder","children":[{"name":"Spring","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\Spring.lua"]},{"name":"SpringScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\SpringScheduler.lua"]},{"name":"Tween","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\Tween.lua"]},{"name":"TweenScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\TweenScheduler.lua"]},{"name":"getTweenRatio","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\getTweenRatio.lua"]},{"name":"lerpType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\lerpType.lua"]},{"name":"packType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\packType.lua"]},{"name":"springCoefficients","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\springCoefficients.lua"]},{"name":"unpackType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\unpackType.lua"]}]},{"name":"Colour","className":"Folder","children":[{"name":"Oklab","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Colour\\Oklab.lua"]}]},{"name":"Instances","className":"Folder","children":[{"name":"Attribute","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Attribute.lua"]},{"name":"AttributeChange","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\AttributeChange.lua"]},{"name":"AttributeOut","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\AttributeOut.lua"]},{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Children.lua"]},{"name":"Cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Cleanup.lua"]},{"name":"Hydrate","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Hydrate.lua"]},{"name":"New","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\New.lua"]},{"name":"OnChange","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\OnChange.lua"]},{"name":"OnEvent","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\OnEvent.lua"]},{"name":"Out","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Out.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Ref.lua"]},{"name":"applyInstanceProps","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\applyInstanceProps.lua"]},{"name":"defaultProps","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\defaultProps.lua"]}]},{"name":"Logging","className":"Folder","children":[{"name":"logError","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logError.lua"]},{"name":"logErrorNonFatal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logErrorNonFatal.lua"]},{"name":"logWarn","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logWarn.lua"]},{"name":"messages","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\messages.lua"]},{"name":"parseError","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\parseError.lua"]}]},{"name":"PubTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\PubTypes.lua"]},{"name":"State","className":"Folder","children":[{"name":"Computed","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Computed.lua"]},{"name":"ForKeys","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForKeys.lua"]},{"name":"ForPairs","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForPairs.lua"]},{"name":"ForValues","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForValues.lua"]},{"name":"Observer","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Observer.lua"]},{"name":"Value","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Value.lua"]},{"name":"isState","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\isState.lua"]},{"name":"makeUseCallback","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\makeUseCallback.lua"]},{"name":"peek","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\peek.lua"]},{"name":"updateAll","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\updateAll.lua"]}]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Types.lua"]},{"name":"Utility","className":"Folder","children":[{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\None.lua"]},{"name":"cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\cleanup.lua"]},{"name":"doNothing","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\doNothing.lua"]},{"name":"isSimilar","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\isSimilar.lua"]},{"name":"needsDestruction","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\needsDestruction.lua"]},{"name":"restrictRead","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\restrictRead.lua"]},{"name":"xtypeof","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\xtypeof.lua"]}]}]},{"name":"InstanceTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\InstanceTypes.luau"]},{"name":"Interface","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Interface.luau"]},{"name":"Test.story","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Test.story.luau"]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Types.luau"]},{"name":"Util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Util.luau"]}]}]},{"name":"nightcycle_curve-util@1.0.0","className":"Folder","children":[{"name":"Vector","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\Vector.lua"]},{"name":"curve-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\init.lua","Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\default.project.json"],"children":[{"name":"Ease","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\Ease.lua"]},{"name":"Lerp","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\Lerp.lua"]}]}]},{"name":"nightcycle_format@0.1.3","className":"Folder","children":[{"name":"format","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\init.lua","Packages\\_Index\\nightcycle_format@0.1.3\\format\\default.project.json"],"children":[{"name":"Emoji","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\Emoji.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\init.spec.lua"]}]},{"name":"maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\maid.lua"]},{"name":"signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\signal.lua"]},{"name":"string","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\string.lua"]}]},{"name":"nightcycle_geometry-util@1.1.1","className":"Folder","children":[{"name":"geometry-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\init.lua","Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\default.project.json"],"children":[{"name":"Earcut","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\Earcut\\init.lua"],"children":[{"name":"ZeroArray","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\Earcut\\ZeroArray.lua"]}]}]}]},{"name":"nightcycle_maid@1.1.4","className":"Folder","children":[{"name":"maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\init.lua","Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\default.project.json"],"children":[{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\Maid.lua"]},{"name":"MaidTaskUtils","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\MaidTaskUtils.lua"]}]}]},{"name":"nightcycle_material-icons@1.0.1","className":"Folder","children":[{"name":"material-icons","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\init.luau","Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\default.project.json"],"children":[{"name":"Default_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_1.luau"]},{"name":"Default_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_2.luau"]},{"name":"Default_18_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_3.luau"]},{"name":"Default_18_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_4.luau"]},{"name":"Default_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_1.luau"]},{"name":"Default_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_2.luau"]},{"name":"Default_24_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_3.luau"]},{"name":"Default_24_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_4.luau"]},{"name":"Default_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_1.luau"]},{"name":"Default_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_2.luau"]},{"name":"Default_36_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_3.luau"]},{"name":"Default_36_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_4.luau"]},{"name":"Default_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_1.luau"]},{"name":"Default_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_2.luau"]},{"name":"Default_48_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_3.luau"]},{"name":"Default_48_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_4.luau"]},{"name":"Outlined_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_18_1.luau"]},{"name":"Outlined_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_18_2.luau"]},{"name":"Outlined_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_24_1.luau"]},{"name":"Outlined_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_24_2.luau"]},{"name":"Outlined_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_36_1.luau"]},{"name":"Outlined_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_36_2.luau"]},{"name":"Outlined_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_48_1.luau"]},{"name":"Outlined_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_48_2.luau"]},{"name":"Round_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_18_1.luau"]},{"name":"Round_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_18_2.luau"]},{"name":"Round_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_24_1.luau"]},{"name":"Round_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_24_2.luau"]},{"name":"Round_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_36_1.luau"]},{"name":"Round_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_36_2.luau"]},{"name":"Round_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_48_1.luau"]},{"name":"Round_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_48_2.luau"]},{"name":"Sharp_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_18_1.luau"]},{"name":"Sharp_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_18_2.luau"]},{"name":"Sharp_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_24_1.luau"]},{"name":"Sharp_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_24_2.luau"]},{"name":"Sharp_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_36_1.luau"]},{"name":"Sharp_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_36_2.luau"]},{"name":"Sharp_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_48_1.luau"]},{"name":"Sharp_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_48_2.luau"]},{"name":"TwoTone_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_18_1.luau"]},{"name":"TwoTone_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_18_2.luau"]},{"name":"TwoTone_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_24_1.luau"]},{"name":"TwoTone_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_24_2.luau"]},{"name":"TwoTone_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_36_1.luau"]},{"name":"TwoTone_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_36_2.luau"]},{"name":"TwoTone_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_48_1.luau"]},{"name":"TwoTone_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_48_2.luau"]}]}]},{"name":"nightcycle_mesh-util@1.0.3","className":"Folder","children":[{"name":"GeometryUtil","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\GeometryUtil.lua"]},{"name":"mesh-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\init.lua","Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\default.project.json"],"children":[{"name":"CornerWedgePart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\CornerWedgePart.lua"]},{"name":"Part","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\Part.lua"]},{"name":"TetraPart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\TetraPart.lua"]},{"name":"WedgePart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\WedgePart.lua"]}]}]},{"name":"nightcycle_service-proxy@1.0.0","className":"Folder","children":[{"name":"service-proxy","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_service-proxy@1.0.0\\service-proxy\\src\\init.lua","Packages\\_Index\\nightcycle_service-proxy@1.0.0\\service-proxy\\default.project.json"]}]},{"name":"nightcycle_signal@1.0.2","className":"Folder","children":[{"name":"signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_signal@1.0.2\\signal\\src\\init.lua","Packages\\_Index\\nightcycle_signal@1.0.2\\signal\\default.project.json"]}]},{"name":"nightcycle_string@0.1.0","className":"Folder","children":[{"name":"string","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_string@0.1.0\\string\\src\\init.lua","Packages\\_Index\\nightcycle_string@0.1.0\\string\\default.project.json"],"children":[{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_string@0.1.0\\string\\src\\init.spec.lua"]}]}]},{"name":"nightcycle_table-util@1.1.0","className":"Folder","children":[{"name":"table-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_table-util@1.1.0\\table-util\\src\\init.lua","Packages\\_Index\\nightcycle_table-util@1.1.0\\table-util\\default.project.json"]}]},{"name":"nightcycle_vector@1.0.2","className":"Folder","children":[{"name":"vector","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_vector@1.0.2\\vector\\src\\init.lua","Packages\\_Index\\nightcycle_vector@1.0.2\\vector\\default.project.json"]}]},{"name":"roblox_roact@1.4.4","className":"Folder","children":[{"name":"roact","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\init.lua","Packages\\_Index\\roblox_roact@1.4.4\\roact\\default.project.json"],"children":[{"name":"Binding","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Binding.lua"]},{"name":"Binding.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Binding.spec.lua"]},{"name":"Component","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.lua"]},{"name":"Component.spec","className":"Folder","children":[{"name":"context.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\context.spec.lua"]},{"name":"defaultProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\defaultProps.spec.lua"]},{"name":"didMount.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\didMount.spec.lua"]},{"name":"didUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\didUpdate.spec.lua"]},{"name":"extend.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\extend.spec.lua"]},{"name":"getDerivedStateFromProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\getDerivedStateFromProps.spec.lua"]},{"name":"getElementTraceback.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\getElementTraceback.spec.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\init.spec.lua"]},{"name":"legacyContext.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\legacyContext.spec.lua"]},{"name":"render.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\render.spec.lua"]},{"name":"setState.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\setState.spec.lua"]},{"name":"shouldUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\shouldUpdate.spec.lua"]},{"name":"validateProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\validateProps.spec.lua"]},{"name":"willUnmount.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\willUnmount.spec.lua"]},{"name":"willUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\willUpdate.spec.lua"]}]},{"name":"ComponentLifecyclePhase","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ComponentLifecyclePhase.lua"]},{"name":"Config","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Config.lua"]},{"name":"Config.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Config.spec.lua"]},{"name":"ElementKind","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementKind.lua"]},{"name":"ElementKind.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementKind.spec.lua"]},{"name":"ElementUtils","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementUtils.lua"]},{"name":"ElementUtils.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementUtils.spec.lua"]},{"name":"GlobalConfig","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\GlobalConfig.lua"]},{"name":"GlobalConfig.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\GlobalConfig.spec.lua"]},{"name":"Logging","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Logging.lua"]},{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\None.lua"]},{"name":"NoopRenderer","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\NoopRenderer.lua"]},{"name":"Portal","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Portal.lua"]},{"name":"PropMarkers","className":"Folder","children":[{"name":"Change","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Change.lua"]},{"name":"Change.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Change.spec.lua"]},{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Children.lua"]},{"name":"Event","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Event.lua"]},{"name":"Event.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Event.spec.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Ref.lua"]}]},{"name":"PureComponent","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PureComponent.lua"]},{"name":"PureComponent.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PureComponent.spec.lua"]},{"name":"RobloxRenderer","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\RobloxRenderer.lua"]},{"name":"RobloxRenderer.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\RobloxRenderer.spec.lua"]},{"name":"SingleEventManager","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\SingleEventManager.lua"]},{"name":"SingleEventManager.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\SingleEventManager.spec.lua"]},{"name":"Symbol","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Symbol.lua"]},{"name":"Symbol.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Symbol.spec.lua"]},{"name":"Type","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Type.lua"]},{"name":"Type.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Type.spec.lua"]},{"name":"assertDeepEqual","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assertDeepEqual.lua"]},{"name":"assertDeepEqual.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assertDeepEqual.spec.lua"]},{"name":"assign","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assign.lua"]},{"name":"assign.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assign.spec.lua"]},{"name":"createContext","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createContext.lua"]},{"name":"createContext.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createContext.spec.lua"]},{"name":"createElement","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createElement.lua"]},{"name":"createElement.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createElement.spec.lua"]},{"name":"createFragment","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createFragment.lua"]},{"name":"createFragment.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createFragment.spec.lua"]},{"name":"createReconciler","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconciler.lua"]},{"name":"createReconciler.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconciler.spec.lua"]},{"name":"createReconcilerCompat","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconcilerCompat.lua"]},{"name":"createReconcilerCompat.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconcilerCompat.spec.lua"]},{"name":"createRef","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createRef.lua"]},{"name":"createRef.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createRef.spec.lua"]},{"name":"createSignal","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSignal.lua"]},{"name":"createSignal.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSignal.spec.lua"]},{"name":"createSpy","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSpy.lua"]},{"name":"createSpy.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSpy.spec.lua"]},{"name":"forwardRef","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\forwardRef.lua"]},{"name":"forwardRef.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\forwardRef.spec.lua"]},{"name":"getDefaultInstanceProperty","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\getDefaultInstanceProperty.lua"]},{"name":"getDefaultInstanceProperty.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\getDefaultInstanceProperty.spec.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\init.spec.lua"]},{"name":"internalAssert","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\internalAssert.lua"]},{"name":"invalidSetStateMessages","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\invalidSetStateMessages.lua"]},{"name":"oneChild","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\oneChild.lua"]},{"name":"oneChild.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\oneChild.spec.lua"]},{"name":"strict","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\strict.lua"]},{"name":"strict.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\strict.spec.lua"]}]}]}]},{"name":"synthetic","className":"ModuleScript","filePaths":["src\\init.luau"],"children":[{"name":"Component","className":"Folder","children":[{"name":"Button","className":"Folder","children":[{"name":"Base","className":"ModuleScript","filePaths":["src\\Component\\Button\\Base.luau"]},{"name":"OutlinedButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedButton\\cfusion.story.luau"]}]},{"name":"TextButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\TextButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\TextButton\\cfusion.story.luau"]}]}]}]},{"name":"Config","className":"ModuleScript","filePaths":["src\\Config.luau"]},{"name":"DropShadow","className":"ModuleScript","filePaths":["src\\DropShadow\\init.luau"]},{"name":"Enums","className":"ModuleScript","filePaths":["src\\Enums.luau"]},{"name":"Sounds","className":"ModuleScript","filePaths":["src\\Sounds.luau"]},{"name":"Test","className":"Folder","children":[{"name":"Source.cfusion","className":"ModuleScript","filePaths":["src\\Test\\Source.cfusion.luau"]}]},{"name":"Types","className":"ModuleScript","filePaths":["src\\Types.luau"]},{"name":"Util","className":"ModuleScript","filePaths":["src\\Util.luau"]}]}]}]}]} \ No newline at end of file diff --git a/src/Component/Button/Base.luau b/src/Component/Button/Base.luau new file mode 100644 index 00000000..4e9919c1 --- /dev/null +++ b/src/Component/Button/Base.luau @@ -0,0 +1,243 @@ + +--!strict +local _Package = script.Parent.Parent.Parent +local _Packages = _Package.Parent +-- Services +local SoundService = game:GetService("SoundService") + +-- Packages +local Maid = require(_Packages:WaitForChild("Maid")) +local ColdFusion = require(_Packages:WaitForChild("ColdFusion")) + +-- Modules +local Enums = require(_Package:WaitForChild("Enums")) +local Types = require(_Package:WaitForChild("Types")) +local Config = require(_Package:WaitForChild("Config")) + +-- Types +type Maid = Maid.Maid +type State = ColdFusion.State +type ValueState = ColdFusion.ValueState +type CanBeState = ColdFusion.CanBeState +type TextStyle = Types.TextStyle +type ImageData = Types.ImageData +type ThemeData = Types.ThemeData +-- Constants +local HEIGHT_DP = 40 +local SHAPE_DP = 20 +local ICON_SIZE_DP = 18 +local CONTAINER_WIDTH_MIN_DP = 48 +local LEFT_RIGHT_PADDING_DP = 12 +local LEFT_PADDING_WITH_ICON_DP = 12 +local RIGHT_PADDING_WITH_ICON_DP = 16 +local PADDING_BETWEEN_ELEMENTS_DP = 8 +local LABEL_TEXT_ALIGNMENT = Enum.TextXAlignment.Center + +return function ( + maid: Maid, + onClick: CanBeState<() -> ()>, + text: CanBeState, + font: CanBeState, + styles: CanBeState<{[Enums.ButtonStateType]: TextStyle}>, + textIcon: CanBeState, + isEnabled: CanBeState, + scale: CanBeState, + sound: CanBeState +): TextButton + + local _fuse = ColdFusion.fuse(maid) + + local _new = _fuse.new + local _bind = _fuse.bind + local _clone = _fuse.clone + local _import = _fuse.import + + local _Value = _fuse.Value + local _Computed = _fuse.Computed + local isEnabledState = _import(isEnabled, true) + local isFocusedState = _Value(false) + local isPressedState = _Value(false) + local isHoveredState = _Value(false) + local currentStateState = _Computed(function(isEnabled: boolean, isFocused: boolean, isPressed: boolean, isHovered: boolean): Enums.ButtonStateType + if isEnabled then + if isPressed then + return Enums.ButtonStateType.Pressed + else + if isHovered then + return Enums.ButtonStateType.Hovered + else + if isFocused then + return Enums.ButtonStateType.Focused + else + return Enums.ButtonStateType.Enabled + end + end + end + else + return Enums.ButtonStateType.Disabled + end + end, isEnabledState, isFocusedState, isPressedState, isHoveredState) :: State + + local stylesState = _import(styles, {}) :: any + local currentStyleState = _Computed(function(state: Enums.ButtonStateType, styles: {[Enums.ButtonStateType]: TextStyle}): TextStyle + local style = styles[state] + assert(style ~= nil, `no style for {state}`) + return style + end, currentStateState, stylesState) + + local onClickState = _import(onClick, function() end) + local textState = _import(text, "") + local fontState = _import(font, Font.fromEnum(Enum.Font.SourceSansSemibold)) + local scaleState = _import(scale, 1) + local iconState = _import(textIcon, nil :: ImageData?) :: any + local soundState = _import(sound, nil :: Sound?) + local inst: TextButton = _new("TextButton")({ + Name = "TextButton", + Text = "", + BackgroundTransparency = _Computed(function(style: TextStyle): number + return style.BackgroundTransparency + end, currentStyleState), + BackgroundColor3 = _Computed(function(style: TextStyle): Color3 + return style.BackgroundColor3 + end, currentStyleState), + Active = isEnabledState, + AutomaticSize = Enum.AutomaticSize.X, + Size = _Computed(function(s: number): UDim2 + return UDim2.fromOffset(0, s * HEIGHT_DP) + end, scaleState), + Events = { + Activated = function() + if isEnabledState:Get() == false then return end + local click = onClickState:Get() + local s = soundState:Get() + if s then + SoundService:PlayLocalSound(s) + end + click() + end, + MouseButton1Down = function(inputObject: InputObject) + isPressedState:Set(true) + end, + MouseButton1Up = function(inputObject: InputObject) + isPressedState:Set(false) + end, + MouseEnter = function() + isHoveredState:Set(true) + end, + MouseLeave = function() + isHoveredState:Set(false) + end, + SelectionGained = function() + isFocusedState:Set(true) + end, + SelectionLost = function() + isFocusedState:Set(false) + end, + }, + Children = { + _new("UICorner")({ + CornerRadius = _Computed(function(s: number): UDim + return UDim.new(0, s * SHAPE_DP) + end, scaleState), + }), + _new("UIStroke")({ + ApplyStrokeMode = Enum.ApplyStrokeMode.Border, + Color = _Computed(function(style: TextStyle): Color3 + return style.BorderColor3 + end, currentStyleState), + LineJoinMode = Enum.LineJoinMode.Round, + Thickness = _Computed(function(s: number): number + return math.max(s*1, 1) + end, scaleState), + Transparency = _Computed(function(style: TextStyle): number + return style.BorderTransparency + end, currentStyleState), + }), + _new("UIListLayout")({ + Padding = _Computed(function(s: number): UDim + return UDim.new(0, s * PADDING_BETWEEN_ELEMENTS_DP) + end, scaleState), + SortOrder = Enum.SortOrder.LayoutOrder, + FillDirection = Enum.FillDirection.Horizontal, + ItemLineAlignment = Enum.ItemLineAlignment.Center, + VerticalAlignment = Enum.VerticalAlignment.Center, + HorizontalAlignment = Enum.HorizontalAlignment.Center, + }), + _new("TextLabel")({ + Text = textState, + TextScaled = true, + TextXAlignment = LABEL_TEXT_ALIGNMENT, + TextYAlignment = Enum.TextYAlignment.Center, + BackgroundTransparency = 1, + AutomaticSize = Enum.AutomaticSize.X, + FontFace = fontState, + LayoutOrder = 2, + TextColor3 = _Computed(function(style: TextStyle): Color3 + return style.TextColor3 + end, currentStyleState), + TextTransparency = _Computed(function(style: TextStyle): number + return style.TextTransparency + end, currentStyleState), + Size = _Computed(function(s: number): UDim2 + return UDim2.fromOffset(0, s * ICON_SIZE_DP) + end, scaleState), + }), + _new("ImageLabel")({ + Name = "Icon", + LayoutOrder = 1, + BackgroundTransparency = 1, + Visible = _Computed(function(icon: ImageData?): boolean + return icon ~= nil + end, iconState), + Image = _Computed(function(icon: ImageData?): string + return if icon then icon.Image else "" + end, iconState), + ImageColor3 = _Computed(function(icon: ImageData?, style: TextStyle?): Color3 + return if icon and style then style.TextColor3 else Color3.new(1,1,1) + end, iconState, currentStyleState), + ImageRectOffset = _Computed(function(icon: ImageData?): Vector2 + return if icon then icon.RectOffset else Vector2.zero + end, iconState), + ImageRectSize = _Computed(function(icon: ImageData?): Vector2 + return if icon then icon.RectSize else Vector2.zero + end, iconState), + ImageTransparency = _Computed(function(icon: ImageData?, style: TextStyle?): number + return if icon and style then style.TextTransparency else 1 + end, iconState, currentStyleState), + Size = _Computed(function(s: number): UDim2 + return UDim2.fromOffset(s * ICON_SIZE_DP, s * ICON_SIZE_DP) + end, scaleState), + }), + _new("UIPadding")({ + PaddingLeft = _Computed(function(s: number, icon: ImageData?): UDim + if icon then + return UDim.new(0, LEFT_PADDING_WITH_ICON_DP * s) + else + return UDim.new(0, LEFT_RIGHT_PADDING_DP * s) + end + end, scaleState, iconState), + PaddingRight = _Computed(function(s: number, icon: ImageData?): UDim + if icon then + return UDim.new(0, RIGHT_PADDING_WITH_ICON_DP * s) + else + return UDim.new(0, LEFT_RIGHT_PADDING_DP * s) + end + end, scaleState, iconState), + PaddingTop = _Computed(function(s: number): UDim + return UDim.new(0, s * (HEIGHT_DP-ICON_SIZE_DP) / 2) + end, scaleState), + PaddingBottom = _Computed(function(s: number): UDim + return UDim.new(0, s * (HEIGHT_DP-ICON_SIZE_DP) / 2) + end, scaleState), + }), + _new("UISizeConstraint")({ + MaxSize = Vector2.new(math.huge, math.huge), + MinSize = _Computed(function(s: number): Vector2 + return Vector2.new(s * CONTAINER_WIDTH_MIN_DP, 0) + end, scaleState), + }), + }, + }) :: TextButton + + return inst +end \ No newline at end of file diff --git a/src/Component/Button/OutlinedButton/cfusion.story.luau b/src/Component/Button/OutlinedButton/cfusion.story.luau new file mode 100644 index 00000000..723c0da2 --- /dev/null +++ b/src/Component/Button/OutlinedButton/cfusion.story.luau @@ -0,0 +1,128 @@ +--!strict +local _Package = script.Parent.Parent.Parent.Parent +local _Packages = _Package.Parent +-- Services +-- Packages +local Maid = require(_Packages:WaitForChild("Maid")) +local MaterialIcons = require(_Packages:WaitForChild("MaterialIcons")) + +-- Modules +local Types = require(_Package:WaitForChild("Types")) +-- Types +-- Constants +local SCALE = 1 +-- Variables +-- References +local Icons = MaterialIcons.default.dp_48.scale_1 + +-- Class +return function(frame: Frame) + local maid = Maid.new() + task.spawn(function() + local function makeHalfFrame( + isDarkMode: boolean, + color: Color3 + ): Frame + + local halfFrame = maid:GiveTask(Instance.new("Frame")) + halfFrame.BackgroundColor3 = if isDarkMode then Color3.new(0.15,0.15,0.15) else Color3.new(0.85, 0.85, 0.85) + + local listLayout = maid:GiveTask(Instance.new("UIListLayout")) + listLayout.FillDirection = Enum.FillDirection.Vertical + listLayout.Padding = UDim.new(0, 10) + listLayout.VerticalAlignment = Enum.VerticalAlignment.Center + listLayout.HorizontalAlignment = Enum.HorizontalAlignment.Center + listLayout.Parent = halfFrame + + local Module = require(script.Parent) + local theme = Types.newThemeData( + 1, + false, + SCALE, + Font.fromEnum(Enum.Font.SourceSans), + color, + halfFrame.BackgroundColor3 + ) + + do + local button = maid:GiveTask(Module.cfusion( + function() + print("click") + end, + "Button", + theme, + nil, + nil + )) + button.Parent = halfFrame + end + + do + local button = maid:GiveTask(Module.cfusion( + function() + print("click") + end, + "Disabled", + theme, + nil, + false + )) + button.Parent = halfFrame + end + + do + local button = maid:GiveTask(Module.cfusion( + function() + print("click") + end, + "Icon", + theme, + Types.newImageData( + Icons.voice_chat.Image, + Icons.voice_chat.ImageRectOffset, + Icons.voice_chat.ImageRectSize + ), + true + )) + button.Parent = halfFrame + end + + return halfFrame + end + + local COLORS: {[number]: Color3} = { + Color3.fromHSV(0, 0.9, 0.8), + Color3.fromHSV(0, 0.25, 0.8), + Color3.fromHSV(0, 0.9, 0.5), + Color3.fromHSV(0.6, 0.9, 0.7), + Color3.fromHSV(0.35, 0.9, 0.7), + Color3.fromHSV(0.1, 0.9, 0.7), + } + + for i, color in ipairs(COLORS) do + local x = (i-1)/(#COLORS) + local width = 1/(#COLORS) + local dark = makeHalfFrame( + true, + color + ) + + dark.Size = UDim2.fromScale(width, 0.5) + dark.Position = UDim2.fromScale(x, 0.5) + dark.Parent = frame + + local bright = makeHalfFrame( + false, + color + ) + bright.Size = UDim2.fromScale(width, 0.5) + bright.Position = UDim2.fromScale(x, 0) + bright.Parent = frame + + end + + end) + return function() + maid:Destroy() + end +end \ No newline at end of file diff --git a/src/Component/Button/OutlinedButton/init.luau b/src/Component/Button/OutlinedButton/init.luau new file mode 100644 index 00000000..aa01ab4a --- /dev/null +++ b/src/Component/Button/OutlinedButton/init.luau @@ -0,0 +1,177 @@ +--!strict +local _Package = script.Parent.Parent.Parent +local _Packages = _Package.Parent +-- Services + +-- Packages +local Maid = require(_Packages:WaitForChild("Maid")) +local ColdFusion = require(_Packages:WaitForChild("ColdFusion")) + +-- Modules +local Sounds = require(_Package:WaitForChild("Sounds")) +local Enums = require(_Package:WaitForChild("Enums")) +local Types = require(_Package:WaitForChild("Types")) +local Config = require(_Package:WaitForChild("Config")) +local Util = require(_Package:WaitForChild("Util")) +local Base = require(script.Parent:WaitForChild("Base")) + +-- Types +type Maid = Maid.Maid +type State = ColdFusion.State +type ValueState = ColdFusion.ValueState +type CanBeState = ColdFusion.CanBeState +type TextStyle = Types.TextStyle +type ImageData = Types.ImageData +type ThemeData = Types.ThemeData +-- Constants +local DEFAULT_VOLUME = Config.Sound.Volume +local HOVER_TRANSPARENCY = Config.Transparency.Background.Hovered +local FOCUS_TRANSPARENCY = Config.Transparency.Background.Focused +local PRESS_TRANSPARENCY = Config.Transparency.Background.Pressed +local DISABLE_TRANSPARENCY = Config.Transparency.Text.Disabled + +-- Variables +-- References +-- Private Functions + + +-- Class +local Interface = {} + +function Interface.cfusion( + onClick: CanBeState<() -> ()>, + text: CanBeState, + theme: CanBeState, + icon: CanBeState?, + isEnabled: CanBeState? +): TextButton + local maid = Maid.new() + + local _fuse = ColdFusion.fuse(maid) + + local _new = _fuse.new + local _bind = _fuse.bind + local _clone = _fuse.clone + local _import = _fuse.import + + local _Value = _fuse.Value + local _Computed = _fuse.Computed + + local onClickState = _import(onClick, function() end) + local textState = _import(text, "") + local themeState = _import(theme, Types.newThemeData( + 1, + false, + 1, + Font.fromEnum(Enum.Font.SourceSansSemibold), + Color3.fromHSV(0.8, 0.4, 0.8) + )) + + local sound = maid:GiveTask(Instance.new("Sound")) + sound.Volume = DEFAULT_VOLUME + sound.SoundId = Sounds.ui_tap_variant_01 + + local styles = _Computed(function(thm: ThemeData): {[Enums.ButtonStateType]: TextStyle} + local textColor: Color3? + if thm.IsDarkMode then + textColor = Util.getReadableColor( + thm.Color3, + if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.DARK_SURFACE, + 12 + ) + else + textColor = Util.getReadableColor( + thm.Color3, + if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.LIGHT_SURFACE, + 5 + ) + end + assert(textColor) + textColor = Util.getElevatedColor( + textColor, + thm.Elevation, + thm.IsDarkMode + ) + local borderColor = (function() + local h,s,v = textColor:ToHSV() + return Color3.fromHSV(h,s*0.25,v*0.8) + end)() + local data = { + [Enums.ButtonStateType.Enabled] = Types.newTextStyle( + textColor, + 0, + textColor, + 1, + borderColor, + 0 + ), + [Enums.ButtonStateType.Disabled] = Types.newTextStyle( + (function(): Color3 + if thm.IsDarkMode then + local h,_s,v = textColor:ToHSV() + return Util.getReadableColor( + Color3.fromHSV(h,0,v), + if thm.BackgroundColor3 then thm.BackgroundColor3 else Color3.new(0.15,0.15,0.15) + ) + else + local h,_s,v = textColor:ToHSV() + return Util.getReadableColor( + Color3.fromHSV(h,0,v), + if thm.BackgroundColor3 then thm.BackgroundColor3 else Color3.new(0.85,0.85,0.85) + ) + end + end)(), + DISABLE_TRANSPARENCY, + textColor, + 1, + borderColor, + DISABLE_TRANSPARENCY + ), + [Enums.ButtonStateType.Focused] = Types.newTextStyle( + textColor, + 0, + textColor, + FOCUS_TRANSPARENCY, + textColor, + FOCUS_TRANSPARENCY + ), + [Enums.ButtonStateType.Hovered] = Types.newTextStyle( + textColor, + 0, + textColor, + HOVER_TRANSPARENCY, + borderColor, + HOVER_TRANSPARENCY + ), + [Enums.ButtonStateType.Pressed] = Types.newTextStyle( + textColor, + 0, + textColor, + PRESS_TRANSPARENCY, + borderColor, + PRESS_TRANSPARENCY + ), + } + return data + end, themeState) + + local button = Base( + maid, + onClickState, + textState, + _Computed(function(t: ThemeData): Font + return t.Font + end, themeState), + styles, + icon, + if isEnabled == nil then true else isEnabled, + _Computed(function(t: ThemeData): number + return t.Scale + end, themeState), + sound + ) + maid.bind(button) + return button +end + +return Interface \ No newline at end of file diff --git a/src/Component/Button/TextButton/init.luau b/src/Component/Button/TextButton/init.luau index 6f181fe7..3fc30f91 100644 --- a/src/Component/Button/TextButton/init.luau +++ b/src/Component/Button/TextButton/init.luau @@ -2,12 +2,10 @@ local _Package = script.Parent.Parent.Parent local _Packages = _Package.Parent -- Services -local SoundService = game:GetService("SoundService") -- Packages local Maid = require(_Packages:WaitForChild("Maid")) local ColdFusion = require(_Packages:WaitForChild("ColdFusion")) -local CurveUtil = require(_Packages:WaitForChild("CurveUtil")) -- Modules local Sounds = require(_Package:WaitForChild("Sounds")) @@ -15,6 +13,7 @@ local Enums = require(_Package:WaitForChild("Enums")) local Types = require(_Package:WaitForChild("Types")) local Config = require(_Package:WaitForChild("Config")) local Util = require(_Package:WaitForChild("Util")) +local Base = require(script.Parent:WaitForChild("Base")) -- Types type Maid = Maid.Maid @@ -25,16 +24,11 @@ type TextStyle = Types.TextStyle type ImageData = Types.ImageData type ThemeData = Types.ThemeData -- Constants -local HEIGHT_DP = 40 -local SHAPE_DP = 20 -local ICON_SIZE_DP = 18 -local CONTAINER_WIDTH_MIN_DP = 48 -local LEFT_RIGHT_PADDING_DP = 12 -local LEFT_PADDING_WITH_ICON_DP = 12 -local RIGHT_PADDING_WITH_ICON_DP = 16 -local PADDING_BETWEEN_ELEMENTS_DP = 8 local DEFAULT_VOLUME = Config.Sound.Volume -local LABEL_TEXT_ALIGNMENT = Enum.TextXAlignment.Center +local HOVER_TRANSPARENCY = Config.Transparency.Background.Hovered +local FOCUS_TRANSPARENCY = Config.Transparency.Background.Focused +local PRESS_TRANSPARENCY = Config.Transparency.Background.Pressed +local DISABLE_TRANSPARENCY = Config.Transparency.Text.Disabled -- Variables -- References @@ -44,202 +38,6 @@ local LABEL_TEXT_ALIGNMENT = Enum.TextXAlignment.Center -- Class local Interface = {} -function Interface._new( - maid: Maid, - onClick: CanBeState<() -> ()>, - text: CanBeState, - font: CanBeState, - styles: CanBeState<{[Enums.ButtonStateType]: TextStyle}>, - textIcon: CanBeState, - isEnabled: CanBeState, - scale: CanBeState, - sound: CanBeState -): TextButton - - local _fuse = ColdFusion.fuse(maid) - - local _new = _fuse.new - local _bind = _fuse.bind - local _clone = _fuse.clone - local _import = _fuse.import - - local _Value = _fuse.Value - local _Computed = _fuse.Computed - local isEnabledState = _import(isEnabled, true) - local isFocusedState = _Value(false) - local isPressedState = _Value(false) - local isHoveredState = _Value(false) - local currentStateState = _Computed(function(isEnabled: boolean, isFocused: boolean, isPressed: boolean, isHovered: boolean): Enums.ButtonStateType - if isEnabled then - if isPressed then - return Enums.ButtonStateType.Pressed - else - if isHovered then - return Enums.ButtonStateType.Hovered - else - if isFocused then - return Enums.ButtonStateType.Focused - else - return Enums.ButtonStateType.Enabled - end - end - end - else - return Enums.ButtonStateType.Disabled - end - end, isEnabledState, isFocusedState, isPressedState, isHoveredState) :: State - - local stylesState = _import(styles, {}) :: any - local currentStyleState = _Computed(function(state: Enums.ButtonStateType, styles: {[Enums.ButtonStateType]: TextStyle}): TextStyle - local style = styles[state] - assert(style ~= nil, `no style for {state}`) - return style - end, currentStateState, stylesState) - - local onClickState = _import(onClick, function() end) - local textState = _import(text, "") - local fontState = _import(font, Font.fromEnum(Enum.Font.SourceSansSemibold)) - local scaleState = _import(scale, 1) - local iconState = _import(textIcon, nil :: ImageData?) :: any - local soundState = _import(sound, nil :: Sound?) - local inst: TextButton = _new("TextButton")({ - Name = "TextButton", - Text = "", - BackgroundTransparency = _Computed(function(style: TextStyle): number - return style.BackgroundTransparency - end, currentStyleState), - BackgroundColor3 = _Computed(function(style: TextStyle): Color3 - return style.BackgroundColor3 - end, currentStyleState), - Active = isEnabledState, - AutomaticSize = Enum.AutomaticSize.X, - Size = _Computed(function(s: number): UDim2 - return UDim2.fromOffset(0, s * HEIGHT_DP) - end, scaleState), - Events = { - Activated = function() - if isEnabledState:Get() == false then return end - local click = onClickState:Get() - local s = soundState:Get() - if s then - SoundService:PlayLocalSound(s) - end - click() - end, - MouseButton1Down = function(inputObject: InputObject) - isPressedState:Set(true) - end, - MouseButton1Up = function(inputObject: InputObject) - isPressedState:Set(false) - end, - MouseEnter = function() - isHoveredState:Set(true) - end, - MouseLeave = function() - isHoveredState:Set(false) - end, - SelectionGained = function() - isFocusedState:Set(true) - end, - SelectionLost = function() - isFocusedState:Set(false) - end, - }, - Children = { - _new("UICorner")({ - CornerRadius = _Computed(function(s: number): UDim - return UDim.new(0, s * SHAPE_DP) - end, scaleState), - }), - _new("UIListLayout")({ - Padding = _Computed(function(s: number): UDim - return UDim.new(0, s * PADDING_BETWEEN_ELEMENTS_DP) - end, scaleState), - SortOrder = Enum.SortOrder.LayoutOrder, - FillDirection = Enum.FillDirection.Horizontal, - ItemLineAlignment = Enum.ItemLineAlignment.Center, - VerticalAlignment = Enum.VerticalAlignment.Center, - HorizontalAlignment = Enum.HorizontalAlignment.Center, - }), - _new("TextLabel")({ - Text = textState, - TextScaled = true, - TextXAlignment = LABEL_TEXT_ALIGNMENT, - TextYAlignment = Enum.TextYAlignment.Center, - BackgroundTransparency = 1, - AutomaticSize = Enum.AutomaticSize.X, - FontFace = fontState, - LayoutOrder = 2, - TextColor3 = _Computed(function(style: TextStyle): Color3 - return style.TextColor3 - end, currentStyleState), - TextTransparency = _Computed(function(style: TextStyle): number - return style.TextTransparency - end, currentStyleState), - Size = _Computed(function(s: number): UDim2 - return UDim2.fromOffset(0, s * ICON_SIZE_DP) - end, scaleState), - }), - _new("ImageLabel")({ - Name = "Icon", - LayoutOrder = 1, - BackgroundTransparency = 1, - Visible = _Computed(function(icon: ImageData?): boolean - return icon ~= nil - end, iconState), - Image = _Computed(function(icon: ImageData?): string - return if icon then icon.Image else "" - end, iconState), - ImageColor3 = _Computed(function(icon: ImageData?, style: TextStyle?): Color3 - return if icon and style then style.TextColor3 else Color3.new(1,1,1) - end, iconState, currentStyleState), - ImageRectOffset = _Computed(function(icon: ImageData?): Vector2 - return if icon then icon.RectOffset else Vector2.zero - end, iconState), - ImageRectSize = _Computed(function(icon: ImageData?): Vector2 - return if icon then icon.RectSize else Vector2.zero - end, iconState), - ImageTransparency = _Computed(function(icon: ImageData?, style: TextStyle?): number - return if icon and style then style.TextTransparency else 1 - end, iconState, currentStyleState), - Size = _Computed(function(s: number): UDim2 - return UDim2.fromOffset(s * ICON_SIZE_DP, s * ICON_SIZE_DP) - end, scaleState), - }), - _new("UIPadding")({ - PaddingLeft = _Computed(function(s: number, icon: ImageData?): UDim - if icon then - return UDim.new(0, LEFT_PADDING_WITH_ICON_DP * s) - else - return UDim.new(0, LEFT_RIGHT_PADDING_DP * s) - end - end, scaleState, iconState), - PaddingRight = _Computed(function(s: number, icon: ImageData?): UDim - if icon then - return UDim.new(0, RIGHT_PADDING_WITH_ICON_DP * s) - else - return UDim.new(0, LEFT_RIGHT_PADDING_DP * s) - end - end, scaleState, iconState), - PaddingTop = _Computed(function(s: number): UDim - return UDim.new(0, s * (HEIGHT_DP-ICON_SIZE_DP) / 2) - end, scaleState), - PaddingBottom = _Computed(function(s: number): UDim - return UDim.new(0, s * (HEIGHT_DP-ICON_SIZE_DP) / 2) - end, scaleState), - }), - _new("UISizeConstraint")({ - MaxSize = Vector2.new(math.huge, math.huge), - MinSize = _Computed(function(s: number): Vector2 - return Vector2.new(s * CONTAINER_WIDTH_MIN_DP, 0) - end, scaleState), - }), - }, - }) :: TextButton - - return inst -end - function Interface.cfusion( onClick: CanBeState<() -> ()>, text: CanBeState, @@ -319,7 +117,7 @@ function Interface.cfusion( ) end end)(), - 0.4, + DISABLE_TRANSPARENCY, textColor, 1, textColor, @@ -329,7 +127,7 @@ function Interface.cfusion( textColor, 0, textColor, - 0.45, + FOCUS_TRANSPARENCY, textColor, 1 ), @@ -337,7 +135,7 @@ function Interface.cfusion( textColor, 0, textColor, - 0.85, + HOVER_TRANSPARENCY, textColor, 1 ), @@ -345,7 +143,7 @@ function Interface.cfusion( textColor, 0, textColor, - 0.6, + PRESS_TRANSPARENCY, textColor, 1 ), @@ -353,7 +151,7 @@ function Interface.cfusion( return data end, themeState) - local button = Interface._new( + local button = Base( maid, onClickState, textState, diff --git a/src/Config.luau b/src/Config.luau index d3a89166..7656eef6 100644 --- a/src/Config.luau +++ b/src/Config.luau @@ -11,5 +11,15 @@ return { Sound = { Volume = 1, + }, + Transparency = { + Text = { + Disabled = 0.4 + }, + Background = { + Hovered = 0.85, + Focused = 0.45, + Pressed = 0.6, + }, } } \ No newline at end of file From 1d46e0cb798c1c7f40989c2c0d8c86009079d07d Mon Sep 17 00:00:00 2001 From: Nightcycle <77173389+nightcycle@users.noreply.github.com> Date: Tue, 5 Dec 2023 17:36:46 -0500 Subject: [PATCH 05/57] Added FilledButton --- sourcemap.json | 2 +- src/Component/Button/Base.luau | 1 - .../Button/FilledButton/cfusion.story.luau | 128 ++++++++++++ src/Component/Button/FilledButton/init.luau | 186 ++++++++++++++++++ .../Button/OutlinedButton/cfusion.story.luau | 2 +- .../Button/TextButton/cfusion.story.luau | 2 +- src/Config.luau | 1 + 7 files changed, 318 insertions(+), 4 deletions(-) create mode 100644 src/Component/Button/FilledButton/cfusion.story.luau create mode 100644 src/Component/Button/FilledButton/init.luau diff --git a/sourcemap.json b/sourcemap.json index 74d3b556..647dfcc8 100644 --- a/sourcemap.json +++ b/sourcemap.json @@ -1 +1 @@ -{"name":"synthetic-test","className":"DataModel","filePaths":["dev.project.json"],"children":[{"name":"ReplicatedStorage","className":"ReplicatedStorage","children":[{"name":"Packages","className":"Folder","children":[{"name":"ColdFusion","className":"ModuleScript","filePaths":["Packages\\ColdFusion.lua"]},{"name":"CurveUtil","className":"ModuleScript","filePaths":["Packages\\CurveUtil.lua"]},{"name":"Format","className":"ModuleScript","filePaths":["Packages\\Format.lua"]},{"name":"Fusion","className":"ModuleScript","filePaths":["Packages\\Fusion.lua"]},{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\Maid.lua"]},{"name":"MaterialIcons","className":"ModuleScript","filePaths":["Packages\\MaterialIcons.lua"]},{"name":"MeshUtil","className":"ModuleScript","filePaths":["Packages\\MeshUtil.lua"]},{"name":"Roact","className":"ModuleScript","filePaths":["Packages\\Roact.lua"]},{"name":"Signal","className":"ModuleScript","filePaths":["Packages\\Signal.lua"]},{"name":"_Index","className":"Folder","children":[{"name":"elttob_fusion@0.2.0","className":"Folder","children":[{"name":"fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\init.lua","Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\default.project.json"],"children":[{"name":"Animation","className":"Folder","children":[{"name":"Spring","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\Spring.lua"]},{"name":"SpringScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\SpringScheduler.lua"]},{"name":"Tween","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\Tween.lua"]},{"name":"TweenScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\TweenScheduler.lua"]},{"name":"getTweenRatio","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\getTweenRatio.lua"]},{"name":"lerpType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\lerpType.lua"]},{"name":"packType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\packType.lua"]},{"name":"springCoefficients","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\springCoefficients.lua"]},{"name":"unpackType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\unpackType.lua"]}]},{"name":"Colour","className":"Folder","children":[{"name":"Oklab","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Colour\\Oklab.lua"]}]},{"name":"Dependencies","className":"Folder","children":[{"name":"captureDependencies","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\captureDependencies.lua"]},{"name":"initDependency","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\initDependency.lua"]},{"name":"sharedState","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\sharedState.lua"]},{"name":"updateAll","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\updateAll.lua"]},{"name":"useDependency","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\useDependency.lua"]}]},{"name":"Instances","className":"Folder","children":[{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Children.lua"]},{"name":"Cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Cleanup.lua"]},{"name":"Hydrate","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Hydrate.lua"]},{"name":"New","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\New.lua"]},{"name":"OnChange","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\OnChange.lua"]},{"name":"OnEvent","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\OnEvent.lua"]},{"name":"Out","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Out.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Ref.lua"]},{"name":"applyInstanceProps","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\applyInstanceProps.lua"]},{"name":"defaultProps","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\defaultProps.lua"]}]},{"name":"Logging","className":"Folder","children":[{"name":"logError","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logError.lua"]},{"name":"logErrorNonFatal","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logErrorNonFatal.lua"]},{"name":"logWarn","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logWarn.lua"]},{"name":"messages","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\messages.lua"]},{"name":"parseError","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\parseError.lua"]}]},{"name":"PubTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\PubTypes.lua"]},{"name":"State","className":"Folder","children":[{"name":"Computed","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Computed.lua"]},{"name":"ForKeys","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForKeys.lua"]},{"name":"ForPairs","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForPairs.lua"]},{"name":"ForValues","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForValues.lua"]},{"name":"Observer","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Observer.lua"]},{"name":"Value","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Value.lua"]},{"name":"unwrap","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\unwrap.lua"]}]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Types.lua"]},{"name":"Utility","className":"Folder","children":[{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\None.lua"]},{"name":"cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\cleanup.lua"]},{"name":"doNothing","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\doNothing.lua"]},{"name":"isSimilar","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\isSimilar.lua"]},{"name":"needsDestruction","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\needsDestruction.lua"]},{"name":"restrictRead","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\restrictRead.lua"]},{"name":"xtypeof","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\xtypeof.lua"]}]}]}]},{"name":"nightcycle_cold-fusion@9.0.7","className":"Folder","children":[{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\Maid.lua"]},{"name":"ServiceProxy","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\ServiceProxy.lua"]},{"name":"Signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\Signal.lua"]},{"name":"TableUtil","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\TableUtil.lua"]},{"name":"cold-fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\init.luau","Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\default.project.json"],"children":[{"name":"Fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\init.lua"],"children":[{"name":"Animation","className":"Folder","children":[{"name":"Spring","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\Spring.lua"]},{"name":"SpringScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\SpringScheduler.lua"]},{"name":"Tween","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\Tween.lua"]},{"name":"TweenScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\TweenScheduler.lua"]},{"name":"getTweenRatio","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\getTweenRatio.lua"]},{"name":"lerpType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\lerpType.lua"]},{"name":"packType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\packType.lua"]},{"name":"springCoefficients","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\springCoefficients.lua"]},{"name":"unpackType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\unpackType.lua"]}]},{"name":"Colour","className":"Folder","children":[{"name":"Oklab","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Colour\\Oklab.lua"]}]},{"name":"Instances","className":"Folder","children":[{"name":"Attribute","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Attribute.lua"]},{"name":"AttributeChange","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\AttributeChange.lua"]},{"name":"AttributeOut","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\AttributeOut.lua"]},{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Children.lua"]},{"name":"Cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Cleanup.lua"]},{"name":"Hydrate","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Hydrate.lua"]},{"name":"New","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\New.lua"]},{"name":"OnChange","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\OnChange.lua"]},{"name":"OnEvent","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\OnEvent.lua"]},{"name":"Out","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Out.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Ref.lua"]},{"name":"applyInstanceProps","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\applyInstanceProps.lua"]},{"name":"defaultProps","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\defaultProps.lua"]}]},{"name":"Logging","className":"Folder","children":[{"name":"logError","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logError.lua"]},{"name":"logErrorNonFatal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logErrorNonFatal.lua"]},{"name":"logWarn","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logWarn.lua"]},{"name":"messages","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\messages.lua"]},{"name":"parseError","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\parseError.lua"]}]},{"name":"PubTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\PubTypes.lua"]},{"name":"State","className":"Folder","children":[{"name":"Computed","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Computed.lua"]},{"name":"ForKeys","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForKeys.lua"]},{"name":"ForPairs","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForPairs.lua"]},{"name":"ForValues","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForValues.lua"]},{"name":"Observer","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Observer.lua"]},{"name":"Value","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Value.lua"]},{"name":"isState","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\isState.lua"]},{"name":"makeUseCallback","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\makeUseCallback.lua"]},{"name":"peek","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\peek.lua"]},{"name":"updateAll","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\updateAll.lua"]}]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Types.lua"]},{"name":"Utility","className":"Folder","children":[{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\None.lua"]},{"name":"cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\cleanup.lua"]},{"name":"doNothing","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\doNothing.lua"]},{"name":"isSimilar","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\isSimilar.lua"]},{"name":"needsDestruction","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\needsDestruction.lua"]},{"name":"restrictRead","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\restrictRead.lua"]},{"name":"xtypeof","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\xtypeof.lua"]}]}]},{"name":"InstanceTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\InstanceTypes.luau"]},{"name":"Interface","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Interface.luau"]},{"name":"Test.story","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Test.story.luau"]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Types.luau"]},{"name":"Util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Util.luau"]}]}]},{"name":"nightcycle_curve-util@1.0.0","className":"Folder","children":[{"name":"Vector","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\Vector.lua"]},{"name":"curve-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\init.lua","Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\default.project.json"],"children":[{"name":"Ease","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\Ease.lua"]},{"name":"Lerp","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\Lerp.lua"]}]}]},{"name":"nightcycle_format@0.1.3","className":"Folder","children":[{"name":"format","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\init.lua","Packages\\_Index\\nightcycle_format@0.1.3\\format\\default.project.json"],"children":[{"name":"Emoji","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\Emoji.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\init.spec.lua"]}]},{"name":"maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\maid.lua"]},{"name":"signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\signal.lua"]},{"name":"string","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\string.lua"]}]},{"name":"nightcycle_geometry-util@1.1.1","className":"Folder","children":[{"name":"geometry-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\init.lua","Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\default.project.json"],"children":[{"name":"Earcut","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\Earcut\\init.lua"],"children":[{"name":"ZeroArray","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\Earcut\\ZeroArray.lua"]}]}]}]},{"name":"nightcycle_maid@1.1.4","className":"Folder","children":[{"name":"maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\init.lua","Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\default.project.json"],"children":[{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\Maid.lua"]},{"name":"MaidTaskUtils","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\MaidTaskUtils.lua"]}]}]},{"name":"nightcycle_material-icons@1.0.1","className":"Folder","children":[{"name":"material-icons","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\init.luau","Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\default.project.json"],"children":[{"name":"Default_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_1.luau"]},{"name":"Default_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_2.luau"]},{"name":"Default_18_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_3.luau"]},{"name":"Default_18_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_4.luau"]},{"name":"Default_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_1.luau"]},{"name":"Default_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_2.luau"]},{"name":"Default_24_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_3.luau"]},{"name":"Default_24_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_4.luau"]},{"name":"Default_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_1.luau"]},{"name":"Default_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_2.luau"]},{"name":"Default_36_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_3.luau"]},{"name":"Default_36_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_4.luau"]},{"name":"Default_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_1.luau"]},{"name":"Default_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_2.luau"]},{"name":"Default_48_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_3.luau"]},{"name":"Default_48_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_4.luau"]},{"name":"Outlined_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_18_1.luau"]},{"name":"Outlined_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_18_2.luau"]},{"name":"Outlined_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_24_1.luau"]},{"name":"Outlined_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_24_2.luau"]},{"name":"Outlined_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_36_1.luau"]},{"name":"Outlined_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_36_2.luau"]},{"name":"Outlined_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_48_1.luau"]},{"name":"Outlined_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_48_2.luau"]},{"name":"Round_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_18_1.luau"]},{"name":"Round_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_18_2.luau"]},{"name":"Round_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_24_1.luau"]},{"name":"Round_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_24_2.luau"]},{"name":"Round_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_36_1.luau"]},{"name":"Round_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_36_2.luau"]},{"name":"Round_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_48_1.luau"]},{"name":"Round_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_48_2.luau"]},{"name":"Sharp_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_18_1.luau"]},{"name":"Sharp_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_18_2.luau"]},{"name":"Sharp_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_24_1.luau"]},{"name":"Sharp_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_24_2.luau"]},{"name":"Sharp_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_36_1.luau"]},{"name":"Sharp_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_36_2.luau"]},{"name":"Sharp_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_48_1.luau"]},{"name":"Sharp_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_48_2.luau"]},{"name":"TwoTone_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_18_1.luau"]},{"name":"TwoTone_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_18_2.luau"]},{"name":"TwoTone_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_24_1.luau"]},{"name":"TwoTone_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_24_2.luau"]},{"name":"TwoTone_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_36_1.luau"]},{"name":"TwoTone_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_36_2.luau"]},{"name":"TwoTone_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_48_1.luau"]},{"name":"TwoTone_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_48_2.luau"]}]}]},{"name":"nightcycle_mesh-util@1.0.3","className":"Folder","children":[{"name":"GeometryUtil","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\GeometryUtil.lua"]},{"name":"mesh-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\init.lua","Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\default.project.json"],"children":[{"name":"CornerWedgePart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\CornerWedgePart.lua"]},{"name":"Part","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\Part.lua"]},{"name":"TetraPart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\TetraPart.lua"]},{"name":"WedgePart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\WedgePart.lua"]}]}]},{"name":"nightcycle_service-proxy@1.0.0","className":"Folder","children":[{"name":"service-proxy","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_service-proxy@1.0.0\\service-proxy\\src\\init.lua","Packages\\_Index\\nightcycle_service-proxy@1.0.0\\service-proxy\\default.project.json"]}]},{"name":"nightcycle_signal@1.0.2","className":"Folder","children":[{"name":"signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_signal@1.0.2\\signal\\src\\init.lua","Packages\\_Index\\nightcycle_signal@1.0.2\\signal\\default.project.json"]}]},{"name":"nightcycle_string@0.1.0","className":"Folder","children":[{"name":"string","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_string@0.1.0\\string\\src\\init.lua","Packages\\_Index\\nightcycle_string@0.1.0\\string\\default.project.json"],"children":[{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_string@0.1.0\\string\\src\\init.spec.lua"]}]}]},{"name":"nightcycle_table-util@1.1.0","className":"Folder","children":[{"name":"table-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_table-util@1.1.0\\table-util\\src\\init.lua","Packages\\_Index\\nightcycle_table-util@1.1.0\\table-util\\default.project.json"]}]},{"name":"nightcycle_vector@1.0.2","className":"Folder","children":[{"name":"vector","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_vector@1.0.2\\vector\\src\\init.lua","Packages\\_Index\\nightcycle_vector@1.0.2\\vector\\default.project.json"]}]},{"name":"roblox_roact@1.4.4","className":"Folder","children":[{"name":"roact","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\init.lua","Packages\\_Index\\roblox_roact@1.4.4\\roact\\default.project.json"],"children":[{"name":"Binding","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Binding.lua"]},{"name":"Binding.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Binding.spec.lua"]},{"name":"Component","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.lua"]},{"name":"Component.spec","className":"Folder","children":[{"name":"context.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\context.spec.lua"]},{"name":"defaultProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\defaultProps.spec.lua"]},{"name":"didMount.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\didMount.spec.lua"]},{"name":"didUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\didUpdate.spec.lua"]},{"name":"extend.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\extend.spec.lua"]},{"name":"getDerivedStateFromProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\getDerivedStateFromProps.spec.lua"]},{"name":"getElementTraceback.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\getElementTraceback.spec.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\init.spec.lua"]},{"name":"legacyContext.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\legacyContext.spec.lua"]},{"name":"render.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\render.spec.lua"]},{"name":"setState.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\setState.spec.lua"]},{"name":"shouldUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\shouldUpdate.spec.lua"]},{"name":"validateProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\validateProps.spec.lua"]},{"name":"willUnmount.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\willUnmount.spec.lua"]},{"name":"willUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\willUpdate.spec.lua"]}]},{"name":"ComponentLifecyclePhase","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ComponentLifecyclePhase.lua"]},{"name":"Config","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Config.lua"]},{"name":"Config.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Config.spec.lua"]},{"name":"ElementKind","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementKind.lua"]},{"name":"ElementKind.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementKind.spec.lua"]},{"name":"ElementUtils","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementUtils.lua"]},{"name":"ElementUtils.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementUtils.spec.lua"]},{"name":"GlobalConfig","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\GlobalConfig.lua"]},{"name":"GlobalConfig.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\GlobalConfig.spec.lua"]},{"name":"Logging","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Logging.lua"]},{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\None.lua"]},{"name":"NoopRenderer","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\NoopRenderer.lua"]},{"name":"Portal","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Portal.lua"]},{"name":"PropMarkers","className":"Folder","children":[{"name":"Change","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Change.lua"]},{"name":"Change.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Change.spec.lua"]},{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Children.lua"]},{"name":"Event","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Event.lua"]},{"name":"Event.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Event.spec.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Ref.lua"]}]},{"name":"PureComponent","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PureComponent.lua"]},{"name":"PureComponent.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PureComponent.spec.lua"]},{"name":"RobloxRenderer","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\RobloxRenderer.lua"]},{"name":"RobloxRenderer.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\RobloxRenderer.spec.lua"]},{"name":"SingleEventManager","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\SingleEventManager.lua"]},{"name":"SingleEventManager.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\SingleEventManager.spec.lua"]},{"name":"Symbol","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Symbol.lua"]},{"name":"Symbol.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Symbol.spec.lua"]},{"name":"Type","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Type.lua"]},{"name":"Type.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Type.spec.lua"]},{"name":"assertDeepEqual","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assertDeepEqual.lua"]},{"name":"assertDeepEqual.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assertDeepEqual.spec.lua"]},{"name":"assign","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assign.lua"]},{"name":"assign.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assign.spec.lua"]},{"name":"createContext","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createContext.lua"]},{"name":"createContext.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createContext.spec.lua"]},{"name":"createElement","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createElement.lua"]},{"name":"createElement.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createElement.spec.lua"]},{"name":"createFragment","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createFragment.lua"]},{"name":"createFragment.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createFragment.spec.lua"]},{"name":"createReconciler","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconciler.lua"]},{"name":"createReconciler.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconciler.spec.lua"]},{"name":"createReconcilerCompat","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconcilerCompat.lua"]},{"name":"createReconcilerCompat.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconcilerCompat.spec.lua"]},{"name":"createRef","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createRef.lua"]},{"name":"createRef.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createRef.spec.lua"]},{"name":"createSignal","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSignal.lua"]},{"name":"createSignal.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSignal.spec.lua"]},{"name":"createSpy","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSpy.lua"]},{"name":"createSpy.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSpy.spec.lua"]},{"name":"forwardRef","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\forwardRef.lua"]},{"name":"forwardRef.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\forwardRef.spec.lua"]},{"name":"getDefaultInstanceProperty","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\getDefaultInstanceProperty.lua"]},{"name":"getDefaultInstanceProperty.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\getDefaultInstanceProperty.spec.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\init.spec.lua"]},{"name":"internalAssert","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\internalAssert.lua"]},{"name":"invalidSetStateMessages","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\invalidSetStateMessages.lua"]},{"name":"oneChild","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\oneChild.lua"]},{"name":"oneChild.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\oneChild.spec.lua"]},{"name":"strict","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\strict.lua"]},{"name":"strict.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\strict.spec.lua"]}]}]}]},{"name":"synthetic","className":"ModuleScript","filePaths":["src\\init.luau"],"children":[{"name":"Component","className":"Folder","children":[{"name":"Button","className":"Folder","children":[{"name":"Base","className":"ModuleScript","filePaths":["src\\Component\\Button\\Base.luau"]},{"name":"OutlinedButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedButton\\cfusion.story.luau"]}]},{"name":"TextButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\TextButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\TextButton\\cfusion.story.luau"]}]}]}]},{"name":"Config","className":"ModuleScript","filePaths":["src\\Config.luau"]},{"name":"DropShadow","className":"ModuleScript","filePaths":["src\\DropShadow\\init.luau"]},{"name":"Enums","className":"ModuleScript","filePaths":["src\\Enums.luau"]},{"name":"Sounds","className":"ModuleScript","filePaths":["src\\Sounds.luau"]},{"name":"Test","className":"Folder","children":[{"name":"Source.cfusion","className":"ModuleScript","filePaths":["src\\Test\\Source.cfusion.luau"]}]},{"name":"Types","className":"ModuleScript","filePaths":["src\\Types.luau"]},{"name":"Util","className":"ModuleScript","filePaths":["src\\Util.luau"]}]}]}]}]} \ No newline at end of file +{"name":"synthetic-test","className":"DataModel","filePaths":["dev.project.json"],"children":[{"name":"ReplicatedStorage","className":"ReplicatedStorage","children":[{"name":"Packages","className":"Folder","children":[{"name":"ColdFusion","className":"ModuleScript","filePaths":["Packages\\ColdFusion.lua"]},{"name":"CurveUtil","className":"ModuleScript","filePaths":["Packages\\CurveUtil.lua"]},{"name":"Format","className":"ModuleScript","filePaths":["Packages\\Format.lua"]},{"name":"Fusion","className":"ModuleScript","filePaths":["Packages\\Fusion.lua"]},{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\Maid.lua"]},{"name":"MaterialIcons","className":"ModuleScript","filePaths":["Packages\\MaterialIcons.lua"]},{"name":"MeshUtil","className":"ModuleScript","filePaths":["Packages\\MeshUtil.lua"]},{"name":"Roact","className":"ModuleScript","filePaths":["Packages\\Roact.lua"]},{"name":"Signal","className":"ModuleScript","filePaths":["Packages\\Signal.lua"]},{"name":"_Index","className":"Folder","children":[{"name":"elttob_fusion@0.2.0","className":"Folder","children":[{"name":"fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\init.lua","Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\default.project.json"],"children":[{"name":"Animation","className":"Folder","children":[{"name":"Spring","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\Spring.lua"]},{"name":"SpringScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\SpringScheduler.lua"]},{"name":"Tween","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\Tween.lua"]},{"name":"TweenScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\TweenScheduler.lua"]},{"name":"getTweenRatio","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\getTweenRatio.lua"]},{"name":"lerpType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\lerpType.lua"]},{"name":"packType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\packType.lua"]},{"name":"springCoefficients","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\springCoefficients.lua"]},{"name":"unpackType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\unpackType.lua"]}]},{"name":"Colour","className":"Folder","children":[{"name":"Oklab","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Colour\\Oklab.lua"]}]},{"name":"Dependencies","className":"Folder","children":[{"name":"captureDependencies","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\captureDependencies.lua"]},{"name":"initDependency","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\initDependency.lua"]},{"name":"sharedState","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\sharedState.lua"]},{"name":"updateAll","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\updateAll.lua"]},{"name":"useDependency","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\useDependency.lua"]}]},{"name":"Instances","className":"Folder","children":[{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Children.lua"]},{"name":"Cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Cleanup.lua"]},{"name":"Hydrate","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Hydrate.lua"]},{"name":"New","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\New.lua"]},{"name":"OnChange","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\OnChange.lua"]},{"name":"OnEvent","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\OnEvent.lua"]},{"name":"Out","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Out.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Ref.lua"]},{"name":"applyInstanceProps","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\applyInstanceProps.lua"]},{"name":"defaultProps","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\defaultProps.lua"]}]},{"name":"Logging","className":"Folder","children":[{"name":"logError","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logError.lua"]},{"name":"logErrorNonFatal","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logErrorNonFatal.lua"]},{"name":"logWarn","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logWarn.lua"]},{"name":"messages","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\messages.lua"]},{"name":"parseError","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\parseError.lua"]}]},{"name":"PubTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\PubTypes.lua"]},{"name":"State","className":"Folder","children":[{"name":"Computed","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Computed.lua"]},{"name":"ForKeys","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForKeys.lua"]},{"name":"ForPairs","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForPairs.lua"]},{"name":"ForValues","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForValues.lua"]},{"name":"Observer","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Observer.lua"]},{"name":"Value","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Value.lua"]},{"name":"unwrap","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\unwrap.lua"]}]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Types.lua"]},{"name":"Utility","className":"Folder","children":[{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\None.lua"]},{"name":"cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\cleanup.lua"]},{"name":"doNothing","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\doNothing.lua"]},{"name":"isSimilar","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\isSimilar.lua"]},{"name":"needsDestruction","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\needsDestruction.lua"]},{"name":"restrictRead","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\restrictRead.lua"]},{"name":"xtypeof","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\xtypeof.lua"]}]}]}]},{"name":"nightcycle_cold-fusion@9.0.7","className":"Folder","children":[{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\Maid.lua"]},{"name":"ServiceProxy","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\ServiceProxy.lua"]},{"name":"Signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\Signal.lua"]},{"name":"TableUtil","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\TableUtil.lua"]},{"name":"cold-fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\init.luau","Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\default.project.json"],"children":[{"name":"Fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\init.lua"],"children":[{"name":"Animation","className":"Folder","children":[{"name":"Spring","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\Spring.lua"]},{"name":"SpringScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\SpringScheduler.lua"]},{"name":"Tween","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\Tween.lua"]},{"name":"TweenScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\TweenScheduler.lua"]},{"name":"getTweenRatio","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\getTweenRatio.lua"]},{"name":"lerpType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\lerpType.lua"]},{"name":"packType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\packType.lua"]},{"name":"springCoefficients","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\springCoefficients.lua"]},{"name":"unpackType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\unpackType.lua"]}]},{"name":"Colour","className":"Folder","children":[{"name":"Oklab","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Colour\\Oklab.lua"]}]},{"name":"Instances","className":"Folder","children":[{"name":"Attribute","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Attribute.lua"]},{"name":"AttributeChange","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\AttributeChange.lua"]},{"name":"AttributeOut","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\AttributeOut.lua"]},{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Children.lua"]},{"name":"Cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Cleanup.lua"]},{"name":"Hydrate","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Hydrate.lua"]},{"name":"New","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\New.lua"]},{"name":"OnChange","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\OnChange.lua"]},{"name":"OnEvent","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\OnEvent.lua"]},{"name":"Out","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Out.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Ref.lua"]},{"name":"applyInstanceProps","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\applyInstanceProps.lua"]},{"name":"defaultProps","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\defaultProps.lua"]}]},{"name":"Logging","className":"Folder","children":[{"name":"logError","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logError.lua"]},{"name":"logErrorNonFatal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logErrorNonFatal.lua"]},{"name":"logWarn","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logWarn.lua"]},{"name":"messages","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\messages.lua"]},{"name":"parseError","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\parseError.lua"]}]},{"name":"PubTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\PubTypes.lua"]},{"name":"State","className":"Folder","children":[{"name":"Computed","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Computed.lua"]},{"name":"ForKeys","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForKeys.lua"]},{"name":"ForPairs","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForPairs.lua"]},{"name":"ForValues","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForValues.lua"]},{"name":"Observer","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Observer.lua"]},{"name":"Value","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Value.lua"]},{"name":"isState","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\isState.lua"]},{"name":"makeUseCallback","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\makeUseCallback.lua"]},{"name":"peek","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\peek.lua"]},{"name":"updateAll","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\updateAll.lua"]}]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Types.lua"]},{"name":"Utility","className":"Folder","children":[{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\None.lua"]},{"name":"cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\cleanup.lua"]},{"name":"doNothing","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\doNothing.lua"]},{"name":"isSimilar","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\isSimilar.lua"]},{"name":"needsDestruction","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\needsDestruction.lua"]},{"name":"restrictRead","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\restrictRead.lua"]},{"name":"xtypeof","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\xtypeof.lua"]}]}]},{"name":"InstanceTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\InstanceTypes.luau"]},{"name":"Interface","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Interface.luau"]},{"name":"Test.story","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Test.story.luau"]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Types.luau"]},{"name":"Util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Util.luau"]}]}]},{"name":"nightcycle_curve-util@1.0.0","className":"Folder","children":[{"name":"Vector","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\Vector.lua"]},{"name":"curve-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\init.lua","Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\default.project.json"],"children":[{"name":"Ease","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\Ease.lua"]},{"name":"Lerp","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\Lerp.lua"]}]}]},{"name":"nightcycle_format@0.1.3","className":"Folder","children":[{"name":"format","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\init.lua","Packages\\_Index\\nightcycle_format@0.1.3\\format\\default.project.json"],"children":[{"name":"Emoji","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\Emoji.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\init.spec.lua"]}]},{"name":"maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\maid.lua"]},{"name":"signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\signal.lua"]},{"name":"string","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\string.lua"]}]},{"name":"nightcycle_geometry-util@1.1.1","className":"Folder","children":[{"name":"geometry-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\init.lua","Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\default.project.json"],"children":[{"name":"Earcut","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\Earcut\\init.lua"],"children":[{"name":"ZeroArray","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\Earcut\\ZeroArray.lua"]}]}]}]},{"name":"nightcycle_maid@1.1.4","className":"Folder","children":[{"name":"maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\init.lua","Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\default.project.json"],"children":[{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\Maid.lua"]},{"name":"MaidTaskUtils","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\MaidTaskUtils.lua"]}]}]},{"name":"nightcycle_material-icons@1.0.1","className":"Folder","children":[{"name":"material-icons","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\init.luau","Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\default.project.json"],"children":[{"name":"Default_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_1.luau"]},{"name":"Default_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_2.luau"]},{"name":"Default_18_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_3.luau"]},{"name":"Default_18_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_4.luau"]},{"name":"Default_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_1.luau"]},{"name":"Default_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_2.luau"]},{"name":"Default_24_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_3.luau"]},{"name":"Default_24_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_4.luau"]},{"name":"Default_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_1.luau"]},{"name":"Default_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_2.luau"]},{"name":"Default_36_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_3.luau"]},{"name":"Default_36_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_4.luau"]},{"name":"Default_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_1.luau"]},{"name":"Default_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_2.luau"]},{"name":"Default_48_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_3.luau"]},{"name":"Default_48_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_4.luau"]},{"name":"Outlined_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_18_1.luau"]},{"name":"Outlined_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_18_2.luau"]},{"name":"Outlined_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_24_1.luau"]},{"name":"Outlined_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_24_2.luau"]},{"name":"Outlined_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_36_1.luau"]},{"name":"Outlined_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_36_2.luau"]},{"name":"Outlined_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_48_1.luau"]},{"name":"Outlined_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_48_2.luau"]},{"name":"Round_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_18_1.luau"]},{"name":"Round_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_18_2.luau"]},{"name":"Round_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_24_1.luau"]},{"name":"Round_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_24_2.luau"]},{"name":"Round_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_36_1.luau"]},{"name":"Round_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_36_2.luau"]},{"name":"Round_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_48_1.luau"]},{"name":"Round_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_48_2.luau"]},{"name":"Sharp_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_18_1.luau"]},{"name":"Sharp_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_18_2.luau"]},{"name":"Sharp_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_24_1.luau"]},{"name":"Sharp_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_24_2.luau"]},{"name":"Sharp_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_36_1.luau"]},{"name":"Sharp_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_36_2.luau"]},{"name":"Sharp_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_48_1.luau"]},{"name":"Sharp_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_48_2.luau"]},{"name":"TwoTone_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_18_1.luau"]},{"name":"TwoTone_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_18_2.luau"]},{"name":"TwoTone_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_24_1.luau"]},{"name":"TwoTone_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_24_2.luau"]},{"name":"TwoTone_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_36_1.luau"]},{"name":"TwoTone_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_36_2.luau"]},{"name":"TwoTone_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_48_1.luau"]},{"name":"TwoTone_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_48_2.luau"]}]}]},{"name":"nightcycle_mesh-util@1.0.3","className":"Folder","children":[{"name":"GeometryUtil","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\GeometryUtil.lua"]},{"name":"mesh-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\init.lua","Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\default.project.json"],"children":[{"name":"CornerWedgePart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\CornerWedgePart.lua"]},{"name":"Part","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\Part.lua"]},{"name":"TetraPart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\TetraPart.lua"]},{"name":"WedgePart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\WedgePart.lua"]}]}]},{"name":"nightcycle_service-proxy@1.0.0","className":"Folder","children":[{"name":"service-proxy","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_service-proxy@1.0.0\\service-proxy\\src\\init.lua","Packages\\_Index\\nightcycle_service-proxy@1.0.0\\service-proxy\\default.project.json"]}]},{"name":"nightcycle_signal@1.0.2","className":"Folder","children":[{"name":"signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_signal@1.0.2\\signal\\src\\init.lua","Packages\\_Index\\nightcycle_signal@1.0.2\\signal\\default.project.json"]}]},{"name":"nightcycle_string@0.1.0","className":"Folder","children":[{"name":"string","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_string@0.1.0\\string\\src\\init.lua","Packages\\_Index\\nightcycle_string@0.1.0\\string\\default.project.json"],"children":[{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_string@0.1.0\\string\\src\\init.spec.lua"]}]}]},{"name":"nightcycle_table-util@1.1.0","className":"Folder","children":[{"name":"table-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_table-util@1.1.0\\table-util\\src\\init.lua","Packages\\_Index\\nightcycle_table-util@1.1.0\\table-util\\default.project.json"]}]},{"name":"nightcycle_vector@1.0.2","className":"Folder","children":[{"name":"vector","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_vector@1.0.2\\vector\\src\\init.lua","Packages\\_Index\\nightcycle_vector@1.0.2\\vector\\default.project.json"]}]},{"name":"roblox_roact@1.4.4","className":"Folder","children":[{"name":"roact","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\init.lua","Packages\\_Index\\roblox_roact@1.4.4\\roact\\default.project.json"],"children":[{"name":"Binding","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Binding.lua"]},{"name":"Binding.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Binding.spec.lua"]},{"name":"Component","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.lua"]},{"name":"Component.spec","className":"Folder","children":[{"name":"context.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\context.spec.lua"]},{"name":"defaultProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\defaultProps.spec.lua"]},{"name":"didMount.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\didMount.spec.lua"]},{"name":"didUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\didUpdate.spec.lua"]},{"name":"extend.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\extend.spec.lua"]},{"name":"getDerivedStateFromProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\getDerivedStateFromProps.spec.lua"]},{"name":"getElementTraceback.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\getElementTraceback.spec.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\init.spec.lua"]},{"name":"legacyContext.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\legacyContext.spec.lua"]},{"name":"render.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\render.spec.lua"]},{"name":"setState.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\setState.spec.lua"]},{"name":"shouldUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\shouldUpdate.spec.lua"]},{"name":"validateProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\validateProps.spec.lua"]},{"name":"willUnmount.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\willUnmount.spec.lua"]},{"name":"willUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\willUpdate.spec.lua"]}]},{"name":"ComponentLifecyclePhase","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ComponentLifecyclePhase.lua"]},{"name":"Config","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Config.lua"]},{"name":"Config.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Config.spec.lua"]},{"name":"ElementKind","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementKind.lua"]},{"name":"ElementKind.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementKind.spec.lua"]},{"name":"ElementUtils","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementUtils.lua"]},{"name":"ElementUtils.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementUtils.spec.lua"]},{"name":"GlobalConfig","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\GlobalConfig.lua"]},{"name":"GlobalConfig.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\GlobalConfig.spec.lua"]},{"name":"Logging","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Logging.lua"]},{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\None.lua"]},{"name":"NoopRenderer","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\NoopRenderer.lua"]},{"name":"Portal","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Portal.lua"]},{"name":"PropMarkers","className":"Folder","children":[{"name":"Change","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Change.lua"]},{"name":"Change.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Change.spec.lua"]},{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Children.lua"]},{"name":"Event","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Event.lua"]},{"name":"Event.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Event.spec.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Ref.lua"]}]},{"name":"PureComponent","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PureComponent.lua"]},{"name":"PureComponent.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PureComponent.spec.lua"]},{"name":"RobloxRenderer","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\RobloxRenderer.lua"]},{"name":"RobloxRenderer.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\RobloxRenderer.spec.lua"]},{"name":"SingleEventManager","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\SingleEventManager.lua"]},{"name":"SingleEventManager.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\SingleEventManager.spec.lua"]},{"name":"Symbol","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Symbol.lua"]},{"name":"Symbol.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Symbol.spec.lua"]},{"name":"Type","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Type.lua"]},{"name":"Type.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Type.spec.lua"]},{"name":"assertDeepEqual","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assertDeepEqual.lua"]},{"name":"assertDeepEqual.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assertDeepEqual.spec.lua"]},{"name":"assign","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assign.lua"]},{"name":"assign.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assign.spec.lua"]},{"name":"createContext","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createContext.lua"]},{"name":"createContext.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createContext.spec.lua"]},{"name":"createElement","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createElement.lua"]},{"name":"createElement.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createElement.spec.lua"]},{"name":"createFragment","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createFragment.lua"]},{"name":"createFragment.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createFragment.spec.lua"]},{"name":"createReconciler","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconciler.lua"]},{"name":"createReconciler.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconciler.spec.lua"]},{"name":"createReconcilerCompat","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconcilerCompat.lua"]},{"name":"createReconcilerCompat.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconcilerCompat.spec.lua"]},{"name":"createRef","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createRef.lua"]},{"name":"createRef.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createRef.spec.lua"]},{"name":"createSignal","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSignal.lua"]},{"name":"createSignal.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSignal.spec.lua"]},{"name":"createSpy","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSpy.lua"]},{"name":"createSpy.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSpy.spec.lua"]},{"name":"forwardRef","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\forwardRef.lua"]},{"name":"forwardRef.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\forwardRef.spec.lua"]},{"name":"getDefaultInstanceProperty","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\getDefaultInstanceProperty.lua"]},{"name":"getDefaultInstanceProperty.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\getDefaultInstanceProperty.spec.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\init.spec.lua"]},{"name":"internalAssert","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\internalAssert.lua"]},{"name":"invalidSetStateMessages","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\invalidSetStateMessages.lua"]},{"name":"oneChild","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\oneChild.lua"]},{"name":"oneChild.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\oneChild.spec.lua"]},{"name":"strict","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\strict.lua"]},{"name":"strict.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\strict.spec.lua"]}]}]}]},{"name":"synthetic","className":"ModuleScript","filePaths":["src\\init.luau"],"children":[{"name":"Component","className":"Folder","children":[{"name":"Button","className":"Folder","children":[{"name":"Base","className":"ModuleScript","filePaths":["src\\Component\\Button\\Base.luau"]},{"name":"FilledButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledButton\\cfusion.story.luau"]}]},{"name":"OutlinedButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedButton\\cfusion.story.luau"]}]},{"name":"TextButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\TextButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\TextButton\\cfusion.story.luau"]}]}]}]},{"name":"Config","className":"ModuleScript","filePaths":["src\\Config.luau"]},{"name":"DropShadow","className":"ModuleScript","filePaths":["src\\DropShadow\\init.luau"]},{"name":"Enums","className":"ModuleScript","filePaths":["src\\Enums.luau"]},{"name":"Sounds","className":"ModuleScript","filePaths":["src\\Sounds.luau"]},{"name":"Test","className":"Folder","children":[{"name":"Source.cfusion","className":"ModuleScript","filePaths":["src\\Test\\Source.cfusion.luau"]}]},{"name":"Types","className":"ModuleScript","filePaths":["src\\Types.luau"]},{"name":"Util","className":"ModuleScript","filePaths":["src\\Util.luau"]}]}]}]}]} \ No newline at end of file diff --git a/src/Component/Button/Base.luau b/src/Component/Button/Base.luau index 4e9919c1..00e78e20 100644 --- a/src/Component/Button/Base.luau +++ b/src/Component/Button/Base.luau @@ -12,7 +12,6 @@ local ColdFusion = require(_Packages:WaitForChild("ColdFusion")) -- Modules local Enums = require(_Package:WaitForChild("Enums")) local Types = require(_Package:WaitForChild("Types")) -local Config = require(_Package:WaitForChild("Config")) -- Types type Maid = Maid.Maid diff --git a/src/Component/Button/FilledButton/cfusion.story.luau b/src/Component/Button/FilledButton/cfusion.story.luau new file mode 100644 index 00000000..d4906360 --- /dev/null +++ b/src/Component/Button/FilledButton/cfusion.story.luau @@ -0,0 +1,128 @@ +--!strict +local _Package = script.Parent.Parent.Parent.Parent +local _Packages = _Package.Parent +-- Services +-- Packages +local Maid = require(_Packages:WaitForChild("Maid")) +local MaterialIcons = require(_Packages:WaitForChild("MaterialIcons")) + +-- Modules +local Types = require(_Package:WaitForChild("Types")) +-- Types +-- Constants +local SCALE = 1 +-- Variables +-- References +local Icons = MaterialIcons.default.dp_48.scale_1 + +-- Class +return function(frame: Frame) + local maid = Maid.new() + task.spawn(function() + local function makeHalfFrame( + isDarkMode: boolean, + color: Color3 + ): Frame + + local halfFrame = maid:GiveTask(Instance.new("Frame")) + halfFrame.BackgroundColor3 = if isDarkMode then Color3.new(0.15,0.15,0.15) else Color3.new(0.85, 0.85, 0.85) + + local listLayout = maid:GiveTask(Instance.new("UIListLayout")) + listLayout.FillDirection = Enum.FillDirection.Vertical + listLayout.Padding = UDim.new(0, 10) + listLayout.VerticalAlignment = Enum.VerticalAlignment.Center + listLayout.HorizontalAlignment = Enum.HorizontalAlignment.Center + listLayout.Parent = halfFrame + + local Module = require(script.Parent) + local theme = Types.newThemeData( + 1, + isDarkMode, + SCALE, + Font.fromEnum(Enum.Font.SourceSans), + color, + halfFrame.BackgroundColor3 + ) + + do + local button = maid:GiveTask(Module.cfusion( + function() + print("click") + end, + "Button", + theme, + nil, + nil + )) + button.Parent = halfFrame + end + + do + local button = maid:GiveTask(Module.cfusion( + function() + print("click") + end, + "Disabled", + theme, + nil, + false + )) + button.Parent = halfFrame + end + + do + local button = maid:GiveTask(Module.cfusion( + function() + print("click") + end, + "Icon", + theme, + Types.newImageData( + Icons.voice_chat.Image, + Icons.voice_chat.ImageRectOffset, + Icons.voice_chat.ImageRectSize + ), + true + )) + button.Parent = halfFrame + end + + return halfFrame + end + + local COLORS: {[number]: Color3} = { + Color3.fromHSV(0, 0.9, 0.8), + Color3.fromHSV(0, 0.25, 0.8), + Color3.fromHSV(0, 0.9, 0.5), + Color3.fromHSV(0.6, 0.9, 0.7), + Color3.fromHSV(0.35, 0.9, 0.7), + Color3.fromHSV(0.1, 0.9, 0.7), + } + + for i, color in ipairs(COLORS) do + local x = (i-1)/(#COLORS) + local width = 1/(#COLORS) + local dark = makeHalfFrame( + true, + color + ) + + dark.Size = UDim2.fromScale(width, 0.5) + dark.Position = UDim2.fromScale(x, 0.5) + dark.Parent = frame + + local bright = makeHalfFrame( + false, + color + ) + bright.Size = UDim2.fromScale(width, 0.5) + bright.Position = UDim2.fromScale(x, 0) + bright.Parent = frame + + end + + end) + return function() + maid:Destroy() + end +end \ No newline at end of file diff --git a/src/Component/Button/FilledButton/init.luau b/src/Component/Button/FilledButton/init.luau new file mode 100644 index 00000000..c5aa3e54 --- /dev/null +++ b/src/Component/Button/FilledButton/init.luau @@ -0,0 +1,186 @@ +--!strict +local _Package = script.Parent.Parent.Parent +local _Packages = _Package.Parent +-- Services + +-- Packages +local Maid = require(_Packages:WaitForChild("Maid")) +local ColdFusion = require(_Packages:WaitForChild("ColdFusion")) + +-- Modules +local Sounds = require(_Package:WaitForChild("Sounds")) +local Enums = require(_Package:WaitForChild("Enums")) +local Types = require(_Package:WaitForChild("Types")) +local Config = require(_Package:WaitForChild("Config")) +local Util = require(_Package:WaitForChild("Util")) +local Base = require(script.Parent:WaitForChild("Base")) + +-- Types +type Maid = Maid.Maid +type State = ColdFusion.State +type ValueState = ColdFusion.ValueState +type CanBeState = ColdFusion.CanBeState +type TextStyle = Types.TextStyle +type ImageData = Types.ImageData +type ThemeData = Types.ThemeData +-- Constants +local DEFAULT_VOLUME = Config.Sound.Volume +local HOVER_TRANSPARENCY = Config.Transparency.Background.Hovered +local FOCUS_TRANSPARENCY = Config.Transparency.Background.Focused +local PRESS_TRANSPARENCY = Config.Transparency.Background.Pressed +local DISABLE_TRANSPARENCY = Config.Transparency.Text.Disabled +local DISABLE_BACK_TRANS = Config.Transparency.Background.Disabled + +-- Variables +-- References +-- Private Functions + + +-- Class +local Interface = {} + +function Interface.cfusion( + onClick: CanBeState<() -> ()>, + text: CanBeState, + theme: CanBeState, + icon: CanBeState?, + isEnabled: CanBeState? +): TextButton + local maid = Maid.new() + + local _fuse = ColdFusion.fuse(maid) + + local _new = _fuse.new + local _bind = _fuse.bind + local _clone = _fuse.clone + local _import = _fuse.import + + local _Value = _fuse.Value + local _Computed = _fuse.Computed + + local onClickState = _import(onClick, function() end) + local textState = _import(text, "") + local themeState = _import(theme, Types.newThemeData( + 1, + false, + 1, + Font.fromEnum(Enum.Font.SourceSansSemibold), + Color3.fromHSV(0.8, 0.4, 0.8) + )) + + local sound = maid:GiveTask(Instance.new("Sound")) + sound.Volume = DEFAULT_VOLUME + sound.SoundId = Sounds.ui_tap_variant_01 + + local styles = _Computed(function(thm: ThemeData): {[Enums.ButtonStateType]: TextStyle} + local backColor: Color3? + local textColor: Color3? + + if thm.IsDarkMode then + backColor = Util.getReadableColor( + thm.Color3, + if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.DARK_SURFACE + ) + assert(backColor) + + textColor = Util.DARK_SURFACE + else + backColor = Util.getReadableColor( + thm.Color3, + if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.LIGHT_SURFACE + ) + assert(backColor) + + textColor = Util.LIGHT_SURFACE + end + assert(backColor) + assert(textColor) + + backColor = Util.getElevatedColor( + backColor, + thm.Elevation, + thm.IsDarkMode + ) + + textColor = Util.getElevatedColor( + textColor, + thm.Elevation, + thm.IsDarkMode + ) + + local disableBackColor = (function(): Color3 + local h,s,v = backColor:ToHSV() + return Color3.fromHSV(h,s*0,v) + end)() + + local data = { + [Enums.ButtonStateType.Enabled] = Types.newTextStyle( + textColor, + 0, + backColor, + 0, + textColor, + 1 + ), + [Enums.ButtonStateType.Disabled] = Types.newTextStyle( + (function(): Color3 + if thm.IsDarkMode then + return Util.LIGHT_SURFACE + else + return Util.DARK_SURFACE + end + end)(), + DISABLE_TRANSPARENCY, + disableBackColor, + DISABLE_BACK_TRANS, + textColor, + 1 + ), + [Enums.ButtonStateType.Focused] = Types.newTextStyle( + textColor, + 0, + backColor, + 0, + textColor, + 1 + ), + [Enums.ButtonStateType.Hovered] = Types.newTextStyle( + textColor, + 0, + backColor, + 0, + textColor, + 1 + ), + [Enums.ButtonStateType.Pressed] = Types.newTextStyle( + textColor, + 0, + backColor, + 0, + textColor, + 1 + ), + } + return data + end, themeState) + + local button = Base( + maid, + onClickState, + textState, + _Computed(function(t: ThemeData): Font + return t.Font + end, themeState), + styles, + icon, + if isEnabled == nil then true else isEnabled, + _Computed(function(t: ThemeData): number + return t.Scale + end, themeState), + sound + ) + maid.bind(button) + return button +end + +return Interface \ No newline at end of file diff --git a/src/Component/Button/OutlinedButton/cfusion.story.luau b/src/Component/Button/OutlinedButton/cfusion.story.luau index 723c0da2..d4906360 100644 --- a/src/Component/Button/OutlinedButton/cfusion.story.luau +++ b/src/Component/Button/OutlinedButton/cfusion.story.luau @@ -37,7 +37,7 @@ return function(frame: Frame) local Module = require(script.Parent) local theme = Types.newThemeData( 1, - false, + isDarkMode, SCALE, Font.fromEnum(Enum.Font.SourceSans), color, diff --git a/src/Component/Button/TextButton/cfusion.story.luau b/src/Component/Button/TextButton/cfusion.story.luau index 723c0da2..d4906360 100644 --- a/src/Component/Button/TextButton/cfusion.story.luau +++ b/src/Component/Button/TextButton/cfusion.story.luau @@ -37,7 +37,7 @@ return function(frame: Frame) local Module = require(script.Parent) local theme = Types.newThemeData( 1, - false, + isDarkMode, SCALE, Font.fromEnum(Enum.Font.SourceSans), color, diff --git a/src/Config.luau b/src/Config.luau index 7656eef6..0f61c380 100644 --- a/src/Config.luau +++ b/src/Config.luau @@ -17,6 +17,7 @@ return { Disabled = 0.4 }, Background = { + Disabled = 0.7, Hovered = 0.85, Focused = 0.45, Pressed = 0.6, From 5b6447cdb394626eff4bd8c21ccb33c2ddcf3f20 Mon Sep 17 00:00:00 2001 From: Nightcycle <77173389+nightcycle@users.noreply.github.com> Date: Tue, 5 Dec 2023 17:59:58 -0500 Subject: [PATCH 06/57] Added elevated button --- sourcemap.json | 2 +- src/Component/Button/Base.luau | 303 ++++++++++-------- .../Button/ElevatedButton/cfusion.story.luau | 128 ++++++++ src/Component/Button/ElevatedButton/init.luau | 184 +++++++++++ src/Component/Button/FilledButton/init.luau | 6 +- src/Component/Button/OutlinedButton/init.luau | 3 +- src/Component/Button/TextButton/init.luau | 3 +- src/DropShadow/init.luau | 55 ---- 8 files changed, 486 insertions(+), 198 deletions(-) create mode 100644 src/Component/Button/ElevatedButton/cfusion.story.luau create mode 100644 src/Component/Button/ElevatedButton/init.luau delete mode 100644 src/DropShadow/init.luau diff --git a/sourcemap.json b/sourcemap.json index 647dfcc8..0068da39 100644 --- a/sourcemap.json +++ b/sourcemap.json @@ -1 +1 @@ -{"name":"synthetic-test","className":"DataModel","filePaths":["dev.project.json"],"children":[{"name":"ReplicatedStorage","className":"ReplicatedStorage","children":[{"name":"Packages","className":"Folder","children":[{"name":"ColdFusion","className":"ModuleScript","filePaths":["Packages\\ColdFusion.lua"]},{"name":"CurveUtil","className":"ModuleScript","filePaths":["Packages\\CurveUtil.lua"]},{"name":"Format","className":"ModuleScript","filePaths":["Packages\\Format.lua"]},{"name":"Fusion","className":"ModuleScript","filePaths":["Packages\\Fusion.lua"]},{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\Maid.lua"]},{"name":"MaterialIcons","className":"ModuleScript","filePaths":["Packages\\MaterialIcons.lua"]},{"name":"MeshUtil","className":"ModuleScript","filePaths":["Packages\\MeshUtil.lua"]},{"name":"Roact","className":"ModuleScript","filePaths":["Packages\\Roact.lua"]},{"name":"Signal","className":"ModuleScript","filePaths":["Packages\\Signal.lua"]},{"name":"_Index","className":"Folder","children":[{"name":"elttob_fusion@0.2.0","className":"Folder","children":[{"name":"fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\init.lua","Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\default.project.json"],"children":[{"name":"Animation","className":"Folder","children":[{"name":"Spring","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\Spring.lua"]},{"name":"SpringScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\SpringScheduler.lua"]},{"name":"Tween","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\Tween.lua"]},{"name":"TweenScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\TweenScheduler.lua"]},{"name":"getTweenRatio","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\getTweenRatio.lua"]},{"name":"lerpType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\lerpType.lua"]},{"name":"packType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\packType.lua"]},{"name":"springCoefficients","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\springCoefficients.lua"]},{"name":"unpackType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\unpackType.lua"]}]},{"name":"Colour","className":"Folder","children":[{"name":"Oklab","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Colour\\Oklab.lua"]}]},{"name":"Dependencies","className":"Folder","children":[{"name":"captureDependencies","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\captureDependencies.lua"]},{"name":"initDependency","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\initDependency.lua"]},{"name":"sharedState","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\sharedState.lua"]},{"name":"updateAll","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\updateAll.lua"]},{"name":"useDependency","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\useDependency.lua"]}]},{"name":"Instances","className":"Folder","children":[{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Children.lua"]},{"name":"Cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Cleanup.lua"]},{"name":"Hydrate","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Hydrate.lua"]},{"name":"New","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\New.lua"]},{"name":"OnChange","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\OnChange.lua"]},{"name":"OnEvent","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\OnEvent.lua"]},{"name":"Out","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Out.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Ref.lua"]},{"name":"applyInstanceProps","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\applyInstanceProps.lua"]},{"name":"defaultProps","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\defaultProps.lua"]}]},{"name":"Logging","className":"Folder","children":[{"name":"logError","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logError.lua"]},{"name":"logErrorNonFatal","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logErrorNonFatal.lua"]},{"name":"logWarn","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logWarn.lua"]},{"name":"messages","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\messages.lua"]},{"name":"parseError","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\parseError.lua"]}]},{"name":"PubTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\PubTypes.lua"]},{"name":"State","className":"Folder","children":[{"name":"Computed","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Computed.lua"]},{"name":"ForKeys","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForKeys.lua"]},{"name":"ForPairs","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForPairs.lua"]},{"name":"ForValues","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForValues.lua"]},{"name":"Observer","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Observer.lua"]},{"name":"Value","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Value.lua"]},{"name":"unwrap","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\unwrap.lua"]}]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Types.lua"]},{"name":"Utility","className":"Folder","children":[{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\None.lua"]},{"name":"cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\cleanup.lua"]},{"name":"doNothing","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\doNothing.lua"]},{"name":"isSimilar","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\isSimilar.lua"]},{"name":"needsDestruction","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\needsDestruction.lua"]},{"name":"restrictRead","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\restrictRead.lua"]},{"name":"xtypeof","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\xtypeof.lua"]}]}]}]},{"name":"nightcycle_cold-fusion@9.0.7","className":"Folder","children":[{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\Maid.lua"]},{"name":"ServiceProxy","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\ServiceProxy.lua"]},{"name":"Signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\Signal.lua"]},{"name":"TableUtil","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\TableUtil.lua"]},{"name":"cold-fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\init.luau","Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\default.project.json"],"children":[{"name":"Fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\init.lua"],"children":[{"name":"Animation","className":"Folder","children":[{"name":"Spring","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\Spring.lua"]},{"name":"SpringScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\SpringScheduler.lua"]},{"name":"Tween","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\Tween.lua"]},{"name":"TweenScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\TweenScheduler.lua"]},{"name":"getTweenRatio","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\getTweenRatio.lua"]},{"name":"lerpType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\lerpType.lua"]},{"name":"packType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\packType.lua"]},{"name":"springCoefficients","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\springCoefficients.lua"]},{"name":"unpackType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\unpackType.lua"]}]},{"name":"Colour","className":"Folder","children":[{"name":"Oklab","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Colour\\Oklab.lua"]}]},{"name":"Instances","className":"Folder","children":[{"name":"Attribute","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Attribute.lua"]},{"name":"AttributeChange","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\AttributeChange.lua"]},{"name":"AttributeOut","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\AttributeOut.lua"]},{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Children.lua"]},{"name":"Cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Cleanup.lua"]},{"name":"Hydrate","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Hydrate.lua"]},{"name":"New","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\New.lua"]},{"name":"OnChange","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\OnChange.lua"]},{"name":"OnEvent","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\OnEvent.lua"]},{"name":"Out","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Out.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Ref.lua"]},{"name":"applyInstanceProps","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\applyInstanceProps.lua"]},{"name":"defaultProps","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\defaultProps.lua"]}]},{"name":"Logging","className":"Folder","children":[{"name":"logError","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logError.lua"]},{"name":"logErrorNonFatal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logErrorNonFatal.lua"]},{"name":"logWarn","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logWarn.lua"]},{"name":"messages","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\messages.lua"]},{"name":"parseError","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\parseError.lua"]}]},{"name":"PubTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\PubTypes.lua"]},{"name":"State","className":"Folder","children":[{"name":"Computed","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Computed.lua"]},{"name":"ForKeys","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForKeys.lua"]},{"name":"ForPairs","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForPairs.lua"]},{"name":"ForValues","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForValues.lua"]},{"name":"Observer","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Observer.lua"]},{"name":"Value","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Value.lua"]},{"name":"isState","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\isState.lua"]},{"name":"makeUseCallback","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\makeUseCallback.lua"]},{"name":"peek","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\peek.lua"]},{"name":"updateAll","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\updateAll.lua"]}]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Types.lua"]},{"name":"Utility","className":"Folder","children":[{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\None.lua"]},{"name":"cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\cleanup.lua"]},{"name":"doNothing","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\doNothing.lua"]},{"name":"isSimilar","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\isSimilar.lua"]},{"name":"needsDestruction","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\needsDestruction.lua"]},{"name":"restrictRead","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\restrictRead.lua"]},{"name":"xtypeof","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\xtypeof.lua"]}]}]},{"name":"InstanceTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\InstanceTypes.luau"]},{"name":"Interface","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Interface.luau"]},{"name":"Test.story","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Test.story.luau"]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Types.luau"]},{"name":"Util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Util.luau"]}]}]},{"name":"nightcycle_curve-util@1.0.0","className":"Folder","children":[{"name":"Vector","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\Vector.lua"]},{"name":"curve-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\init.lua","Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\default.project.json"],"children":[{"name":"Ease","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\Ease.lua"]},{"name":"Lerp","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\Lerp.lua"]}]}]},{"name":"nightcycle_format@0.1.3","className":"Folder","children":[{"name":"format","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\init.lua","Packages\\_Index\\nightcycle_format@0.1.3\\format\\default.project.json"],"children":[{"name":"Emoji","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\Emoji.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\init.spec.lua"]}]},{"name":"maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\maid.lua"]},{"name":"signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\signal.lua"]},{"name":"string","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\string.lua"]}]},{"name":"nightcycle_geometry-util@1.1.1","className":"Folder","children":[{"name":"geometry-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\init.lua","Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\default.project.json"],"children":[{"name":"Earcut","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\Earcut\\init.lua"],"children":[{"name":"ZeroArray","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\Earcut\\ZeroArray.lua"]}]}]}]},{"name":"nightcycle_maid@1.1.4","className":"Folder","children":[{"name":"maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\init.lua","Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\default.project.json"],"children":[{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\Maid.lua"]},{"name":"MaidTaskUtils","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\MaidTaskUtils.lua"]}]}]},{"name":"nightcycle_material-icons@1.0.1","className":"Folder","children":[{"name":"material-icons","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\init.luau","Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\default.project.json"],"children":[{"name":"Default_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_1.luau"]},{"name":"Default_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_2.luau"]},{"name":"Default_18_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_3.luau"]},{"name":"Default_18_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_4.luau"]},{"name":"Default_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_1.luau"]},{"name":"Default_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_2.luau"]},{"name":"Default_24_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_3.luau"]},{"name":"Default_24_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_4.luau"]},{"name":"Default_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_1.luau"]},{"name":"Default_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_2.luau"]},{"name":"Default_36_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_3.luau"]},{"name":"Default_36_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_4.luau"]},{"name":"Default_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_1.luau"]},{"name":"Default_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_2.luau"]},{"name":"Default_48_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_3.luau"]},{"name":"Default_48_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_4.luau"]},{"name":"Outlined_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_18_1.luau"]},{"name":"Outlined_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_18_2.luau"]},{"name":"Outlined_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_24_1.luau"]},{"name":"Outlined_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_24_2.luau"]},{"name":"Outlined_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_36_1.luau"]},{"name":"Outlined_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_36_2.luau"]},{"name":"Outlined_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_48_1.luau"]},{"name":"Outlined_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_48_2.luau"]},{"name":"Round_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_18_1.luau"]},{"name":"Round_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_18_2.luau"]},{"name":"Round_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_24_1.luau"]},{"name":"Round_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_24_2.luau"]},{"name":"Round_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_36_1.luau"]},{"name":"Round_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_36_2.luau"]},{"name":"Round_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_48_1.luau"]},{"name":"Round_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_48_2.luau"]},{"name":"Sharp_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_18_1.luau"]},{"name":"Sharp_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_18_2.luau"]},{"name":"Sharp_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_24_1.luau"]},{"name":"Sharp_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_24_2.luau"]},{"name":"Sharp_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_36_1.luau"]},{"name":"Sharp_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_36_2.luau"]},{"name":"Sharp_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_48_1.luau"]},{"name":"Sharp_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_48_2.luau"]},{"name":"TwoTone_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_18_1.luau"]},{"name":"TwoTone_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_18_2.luau"]},{"name":"TwoTone_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_24_1.luau"]},{"name":"TwoTone_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_24_2.luau"]},{"name":"TwoTone_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_36_1.luau"]},{"name":"TwoTone_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_36_2.luau"]},{"name":"TwoTone_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_48_1.luau"]},{"name":"TwoTone_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_48_2.luau"]}]}]},{"name":"nightcycle_mesh-util@1.0.3","className":"Folder","children":[{"name":"GeometryUtil","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\GeometryUtil.lua"]},{"name":"mesh-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\init.lua","Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\default.project.json"],"children":[{"name":"CornerWedgePart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\CornerWedgePart.lua"]},{"name":"Part","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\Part.lua"]},{"name":"TetraPart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\TetraPart.lua"]},{"name":"WedgePart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\WedgePart.lua"]}]}]},{"name":"nightcycle_service-proxy@1.0.0","className":"Folder","children":[{"name":"service-proxy","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_service-proxy@1.0.0\\service-proxy\\src\\init.lua","Packages\\_Index\\nightcycle_service-proxy@1.0.0\\service-proxy\\default.project.json"]}]},{"name":"nightcycle_signal@1.0.2","className":"Folder","children":[{"name":"signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_signal@1.0.2\\signal\\src\\init.lua","Packages\\_Index\\nightcycle_signal@1.0.2\\signal\\default.project.json"]}]},{"name":"nightcycle_string@0.1.0","className":"Folder","children":[{"name":"string","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_string@0.1.0\\string\\src\\init.lua","Packages\\_Index\\nightcycle_string@0.1.0\\string\\default.project.json"],"children":[{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_string@0.1.0\\string\\src\\init.spec.lua"]}]}]},{"name":"nightcycle_table-util@1.1.0","className":"Folder","children":[{"name":"table-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_table-util@1.1.0\\table-util\\src\\init.lua","Packages\\_Index\\nightcycle_table-util@1.1.0\\table-util\\default.project.json"]}]},{"name":"nightcycle_vector@1.0.2","className":"Folder","children":[{"name":"vector","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_vector@1.0.2\\vector\\src\\init.lua","Packages\\_Index\\nightcycle_vector@1.0.2\\vector\\default.project.json"]}]},{"name":"roblox_roact@1.4.4","className":"Folder","children":[{"name":"roact","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\init.lua","Packages\\_Index\\roblox_roact@1.4.4\\roact\\default.project.json"],"children":[{"name":"Binding","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Binding.lua"]},{"name":"Binding.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Binding.spec.lua"]},{"name":"Component","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.lua"]},{"name":"Component.spec","className":"Folder","children":[{"name":"context.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\context.spec.lua"]},{"name":"defaultProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\defaultProps.spec.lua"]},{"name":"didMount.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\didMount.spec.lua"]},{"name":"didUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\didUpdate.spec.lua"]},{"name":"extend.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\extend.spec.lua"]},{"name":"getDerivedStateFromProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\getDerivedStateFromProps.spec.lua"]},{"name":"getElementTraceback.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\getElementTraceback.spec.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\init.spec.lua"]},{"name":"legacyContext.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\legacyContext.spec.lua"]},{"name":"render.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\render.spec.lua"]},{"name":"setState.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\setState.spec.lua"]},{"name":"shouldUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\shouldUpdate.spec.lua"]},{"name":"validateProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\validateProps.spec.lua"]},{"name":"willUnmount.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\willUnmount.spec.lua"]},{"name":"willUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\willUpdate.spec.lua"]}]},{"name":"ComponentLifecyclePhase","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ComponentLifecyclePhase.lua"]},{"name":"Config","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Config.lua"]},{"name":"Config.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Config.spec.lua"]},{"name":"ElementKind","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementKind.lua"]},{"name":"ElementKind.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementKind.spec.lua"]},{"name":"ElementUtils","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementUtils.lua"]},{"name":"ElementUtils.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementUtils.spec.lua"]},{"name":"GlobalConfig","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\GlobalConfig.lua"]},{"name":"GlobalConfig.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\GlobalConfig.spec.lua"]},{"name":"Logging","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Logging.lua"]},{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\None.lua"]},{"name":"NoopRenderer","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\NoopRenderer.lua"]},{"name":"Portal","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Portal.lua"]},{"name":"PropMarkers","className":"Folder","children":[{"name":"Change","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Change.lua"]},{"name":"Change.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Change.spec.lua"]},{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Children.lua"]},{"name":"Event","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Event.lua"]},{"name":"Event.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Event.spec.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Ref.lua"]}]},{"name":"PureComponent","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PureComponent.lua"]},{"name":"PureComponent.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PureComponent.spec.lua"]},{"name":"RobloxRenderer","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\RobloxRenderer.lua"]},{"name":"RobloxRenderer.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\RobloxRenderer.spec.lua"]},{"name":"SingleEventManager","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\SingleEventManager.lua"]},{"name":"SingleEventManager.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\SingleEventManager.spec.lua"]},{"name":"Symbol","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Symbol.lua"]},{"name":"Symbol.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Symbol.spec.lua"]},{"name":"Type","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Type.lua"]},{"name":"Type.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Type.spec.lua"]},{"name":"assertDeepEqual","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assertDeepEqual.lua"]},{"name":"assertDeepEqual.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assertDeepEqual.spec.lua"]},{"name":"assign","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assign.lua"]},{"name":"assign.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assign.spec.lua"]},{"name":"createContext","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createContext.lua"]},{"name":"createContext.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createContext.spec.lua"]},{"name":"createElement","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createElement.lua"]},{"name":"createElement.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createElement.spec.lua"]},{"name":"createFragment","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createFragment.lua"]},{"name":"createFragment.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createFragment.spec.lua"]},{"name":"createReconciler","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconciler.lua"]},{"name":"createReconciler.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconciler.spec.lua"]},{"name":"createReconcilerCompat","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconcilerCompat.lua"]},{"name":"createReconcilerCompat.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconcilerCompat.spec.lua"]},{"name":"createRef","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createRef.lua"]},{"name":"createRef.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createRef.spec.lua"]},{"name":"createSignal","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSignal.lua"]},{"name":"createSignal.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSignal.spec.lua"]},{"name":"createSpy","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSpy.lua"]},{"name":"createSpy.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSpy.spec.lua"]},{"name":"forwardRef","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\forwardRef.lua"]},{"name":"forwardRef.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\forwardRef.spec.lua"]},{"name":"getDefaultInstanceProperty","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\getDefaultInstanceProperty.lua"]},{"name":"getDefaultInstanceProperty.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\getDefaultInstanceProperty.spec.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\init.spec.lua"]},{"name":"internalAssert","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\internalAssert.lua"]},{"name":"invalidSetStateMessages","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\invalidSetStateMessages.lua"]},{"name":"oneChild","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\oneChild.lua"]},{"name":"oneChild.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\oneChild.spec.lua"]},{"name":"strict","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\strict.lua"]},{"name":"strict.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\strict.spec.lua"]}]}]}]},{"name":"synthetic","className":"ModuleScript","filePaths":["src\\init.luau"],"children":[{"name":"Component","className":"Folder","children":[{"name":"Button","className":"Folder","children":[{"name":"Base","className":"ModuleScript","filePaths":["src\\Component\\Button\\Base.luau"]},{"name":"FilledButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledButton\\cfusion.story.luau"]}]},{"name":"OutlinedButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedButton\\cfusion.story.luau"]}]},{"name":"TextButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\TextButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\TextButton\\cfusion.story.luau"]}]}]}]},{"name":"Config","className":"ModuleScript","filePaths":["src\\Config.luau"]},{"name":"DropShadow","className":"ModuleScript","filePaths":["src\\DropShadow\\init.luau"]},{"name":"Enums","className":"ModuleScript","filePaths":["src\\Enums.luau"]},{"name":"Sounds","className":"ModuleScript","filePaths":["src\\Sounds.luau"]},{"name":"Test","className":"Folder","children":[{"name":"Source.cfusion","className":"ModuleScript","filePaths":["src\\Test\\Source.cfusion.luau"]}]},{"name":"Types","className":"ModuleScript","filePaths":["src\\Types.luau"]},{"name":"Util","className":"ModuleScript","filePaths":["src\\Util.luau"]}]}]}]}]} \ No newline at end of file +{"name":"synthetic-test","className":"DataModel","filePaths":["dev.project.json"],"children":[{"name":"ReplicatedStorage","className":"ReplicatedStorage","children":[{"name":"Packages","className":"Folder","children":[{"name":"ColdFusion","className":"ModuleScript","filePaths":["Packages\\ColdFusion.lua"]},{"name":"CurveUtil","className":"ModuleScript","filePaths":["Packages\\CurveUtil.lua"]},{"name":"Format","className":"ModuleScript","filePaths":["Packages\\Format.lua"]},{"name":"Fusion","className":"ModuleScript","filePaths":["Packages\\Fusion.lua"]},{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\Maid.lua"]},{"name":"MaterialIcons","className":"ModuleScript","filePaths":["Packages\\MaterialIcons.lua"]},{"name":"MeshUtil","className":"ModuleScript","filePaths":["Packages\\MeshUtil.lua"]},{"name":"Roact","className":"ModuleScript","filePaths":["Packages\\Roact.lua"]},{"name":"Signal","className":"ModuleScript","filePaths":["Packages\\Signal.lua"]},{"name":"_Index","className":"Folder","children":[{"name":"elttob_fusion@0.2.0","className":"Folder","children":[{"name":"fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\init.lua","Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\default.project.json"],"children":[{"name":"Animation","className":"Folder","children":[{"name":"Spring","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\Spring.lua"]},{"name":"SpringScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\SpringScheduler.lua"]},{"name":"Tween","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\Tween.lua"]},{"name":"TweenScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\TweenScheduler.lua"]},{"name":"getTweenRatio","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\getTweenRatio.lua"]},{"name":"lerpType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\lerpType.lua"]},{"name":"packType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\packType.lua"]},{"name":"springCoefficients","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\springCoefficients.lua"]},{"name":"unpackType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\unpackType.lua"]}]},{"name":"Colour","className":"Folder","children":[{"name":"Oklab","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Colour\\Oklab.lua"]}]},{"name":"Dependencies","className":"Folder","children":[{"name":"captureDependencies","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\captureDependencies.lua"]},{"name":"initDependency","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\initDependency.lua"]},{"name":"sharedState","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\sharedState.lua"]},{"name":"updateAll","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\updateAll.lua"]},{"name":"useDependency","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\useDependency.lua"]}]},{"name":"Instances","className":"Folder","children":[{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Children.lua"]},{"name":"Cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Cleanup.lua"]},{"name":"Hydrate","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Hydrate.lua"]},{"name":"New","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\New.lua"]},{"name":"OnChange","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\OnChange.lua"]},{"name":"OnEvent","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\OnEvent.lua"]},{"name":"Out","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Out.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Ref.lua"]},{"name":"applyInstanceProps","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\applyInstanceProps.lua"]},{"name":"defaultProps","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\defaultProps.lua"]}]},{"name":"Logging","className":"Folder","children":[{"name":"logError","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logError.lua"]},{"name":"logErrorNonFatal","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logErrorNonFatal.lua"]},{"name":"logWarn","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logWarn.lua"]},{"name":"messages","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\messages.lua"]},{"name":"parseError","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\parseError.lua"]}]},{"name":"PubTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\PubTypes.lua"]},{"name":"State","className":"Folder","children":[{"name":"Computed","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Computed.lua"]},{"name":"ForKeys","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForKeys.lua"]},{"name":"ForPairs","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForPairs.lua"]},{"name":"ForValues","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForValues.lua"]},{"name":"Observer","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Observer.lua"]},{"name":"Value","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Value.lua"]},{"name":"unwrap","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\unwrap.lua"]}]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Types.lua"]},{"name":"Utility","className":"Folder","children":[{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\None.lua"]},{"name":"cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\cleanup.lua"]},{"name":"doNothing","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\doNothing.lua"]},{"name":"isSimilar","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\isSimilar.lua"]},{"name":"needsDestruction","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\needsDestruction.lua"]},{"name":"restrictRead","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\restrictRead.lua"]},{"name":"xtypeof","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\xtypeof.lua"]}]}]}]},{"name":"nightcycle_cold-fusion@9.0.7","className":"Folder","children":[{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\Maid.lua"]},{"name":"ServiceProxy","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\ServiceProxy.lua"]},{"name":"Signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\Signal.lua"]},{"name":"TableUtil","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\TableUtil.lua"]},{"name":"cold-fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\init.luau","Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\default.project.json"],"children":[{"name":"Fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\init.lua"],"children":[{"name":"Animation","className":"Folder","children":[{"name":"Spring","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\Spring.lua"]},{"name":"SpringScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\SpringScheduler.lua"]},{"name":"Tween","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\Tween.lua"]},{"name":"TweenScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\TweenScheduler.lua"]},{"name":"getTweenRatio","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\getTweenRatio.lua"]},{"name":"lerpType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\lerpType.lua"]},{"name":"packType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\packType.lua"]},{"name":"springCoefficients","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\springCoefficients.lua"]},{"name":"unpackType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\unpackType.lua"]}]},{"name":"Colour","className":"Folder","children":[{"name":"Oklab","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Colour\\Oklab.lua"]}]},{"name":"Instances","className":"Folder","children":[{"name":"Attribute","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Attribute.lua"]},{"name":"AttributeChange","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\AttributeChange.lua"]},{"name":"AttributeOut","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\AttributeOut.lua"]},{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Children.lua"]},{"name":"Cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Cleanup.lua"]},{"name":"Hydrate","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Hydrate.lua"]},{"name":"New","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\New.lua"]},{"name":"OnChange","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\OnChange.lua"]},{"name":"OnEvent","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\OnEvent.lua"]},{"name":"Out","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Out.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Ref.lua"]},{"name":"applyInstanceProps","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\applyInstanceProps.lua"]},{"name":"defaultProps","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\defaultProps.lua"]}]},{"name":"Logging","className":"Folder","children":[{"name":"logError","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logError.lua"]},{"name":"logErrorNonFatal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logErrorNonFatal.lua"]},{"name":"logWarn","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logWarn.lua"]},{"name":"messages","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\messages.lua"]},{"name":"parseError","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\parseError.lua"]}]},{"name":"PubTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\PubTypes.lua"]},{"name":"State","className":"Folder","children":[{"name":"Computed","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Computed.lua"]},{"name":"ForKeys","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForKeys.lua"]},{"name":"ForPairs","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForPairs.lua"]},{"name":"ForValues","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForValues.lua"]},{"name":"Observer","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Observer.lua"]},{"name":"Value","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Value.lua"]},{"name":"isState","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\isState.lua"]},{"name":"makeUseCallback","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\makeUseCallback.lua"]},{"name":"peek","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\peek.lua"]},{"name":"updateAll","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\updateAll.lua"]}]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Types.lua"]},{"name":"Utility","className":"Folder","children":[{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\None.lua"]},{"name":"cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\cleanup.lua"]},{"name":"doNothing","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\doNothing.lua"]},{"name":"isSimilar","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\isSimilar.lua"]},{"name":"needsDestruction","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\needsDestruction.lua"]},{"name":"restrictRead","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\restrictRead.lua"]},{"name":"xtypeof","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\xtypeof.lua"]}]}]},{"name":"InstanceTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\InstanceTypes.luau"]},{"name":"Interface","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Interface.luau"]},{"name":"Test.story","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Test.story.luau"]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Types.luau"]},{"name":"Util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Util.luau"]}]}]},{"name":"nightcycle_curve-util@1.0.0","className":"Folder","children":[{"name":"Vector","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\Vector.lua"]},{"name":"curve-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\init.lua","Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\default.project.json"],"children":[{"name":"Ease","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\Ease.lua"]},{"name":"Lerp","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\Lerp.lua"]}]}]},{"name":"nightcycle_format@0.1.3","className":"Folder","children":[{"name":"format","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\init.lua","Packages\\_Index\\nightcycle_format@0.1.3\\format\\default.project.json"],"children":[{"name":"Emoji","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\Emoji.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\init.spec.lua"]}]},{"name":"maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\maid.lua"]},{"name":"signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\signal.lua"]},{"name":"string","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\string.lua"]}]},{"name":"nightcycle_geometry-util@1.1.1","className":"Folder","children":[{"name":"geometry-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\init.lua","Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\default.project.json"],"children":[{"name":"Earcut","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\Earcut\\init.lua"],"children":[{"name":"ZeroArray","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\Earcut\\ZeroArray.lua"]}]}]}]},{"name":"nightcycle_maid@1.1.4","className":"Folder","children":[{"name":"maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\init.lua","Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\default.project.json"],"children":[{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\Maid.lua"]},{"name":"MaidTaskUtils","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\MaidTaskUtils.lua"]}]}]},{"name":"nightcycle_material-icons@1.0.1","className":"Folder","children":[{"name":"material-icons","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\init.luau","Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\default.project.json"],"children":[{"name":"Default_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_1.luau"]},{"name":"Default_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_2.luau"]},{"name":"Default_18_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_3.luau"]},{"name":"Default_18_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_4.luau"]},{"name":"Default_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_1.luau"]},{"name":"Default_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_2.luau"]},{"name":"Default_24_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_3.luau"]},{"name":"Default_24_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_4.luau"]},{"name":"Default_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_1.luau"]},{"name":"Default_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_2.luau"]},{"name":"Default_36_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_3.luau"]},{"name":"Default_36_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_4.luau"]},{"name":"Default_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_1.luau"]},{"name":"Default_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_2.luau"]},{"name":"Default_48_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_3.luau"]},{"name":"Default_48_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_4.luau"]},{"name":"Outlined_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_18_1.luau"]},{"name":"Outlined_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_18_2.luau"]},{"name":"Outlined_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_24_1.luau"]},{"name":"Outlined_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_24_2.luau"]},{"name":"Outlined_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_36_1.luau"]},{"name":"Outlined_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_36_2.luau"]},{"name":"Outlined_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_48_1.luau"]},{"name":"Outlined_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_48_2.luau"]},{"name":"Round_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_18_1.luau"]},{"name":"Round_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_18_2.luau"]},{"name":"Round_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_24_1.luau"]},{"name":"Round_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_24_2.luau"]},{"name":"Round_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_36_1.luau"]},{"name":"Round_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_36_2.luau"]},{"name":"Round_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_48_1.luau"]},{"name":"Round_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_48_2.luau"]},{"name":"Sharp_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_18_1.luau"]},{"name":"Sharp_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_18_2.luau"]},{"name":"Sharp_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_24_1.luau"]},{"name":"Sharp_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_24_2.luau"]},{"name":"Sharp_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_36_1.luau"]},{"name":"Sharp_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_36_2.luau"]},{"name":"Sharp_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_48_1.luau"]},{"name":"Sharp_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_48_2.luau"]},{"name":"TwoTone_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_18_1.luau"]},{"name":"TwoTone_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_18_2.luau"]},{"name":"TwoTone_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_24_1.luau"]},{"name":"TwoTone_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_24_2.luau"]},{"name":"TwoTone_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_36_1.luau"]},{"name":"TwoTone_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_36_2.luau"]},{"name":"TwoTone_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_48_1.luau"]},{"name":"TwoTone_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_48_2.luau"]}]}]},{"name":"nightcycle_mesh-util@1.0.3","className":"Folder","children":[{"name":"GeometryUtil","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\GeometryUtil.lua"]},{"name":"mesh-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\init.lua","Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\default.project.json"],"children":[{"name":"CornerWedgePart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\CornerWedgePart.lua"]},{"name":"Part","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\Part.lua"]},{"name":"TetraPart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\TetraPart.lua"]},{"name":"WedgePart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\WedgePart.lua"]}]}]},{"name":"nightcycle_service-proxy@1.0.0","className":"Folder","children":[{"name":"service-proxy","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_service-proxy@1.0.0\\service-proxy\\src\\init.lua","Packages\\_Index\\nightcycle_service-proxy@1.0.0\\service-proxy\\default.project.json"]}]},{"name":"nightcycle_signal@1.0.2","className":"Folder","children":[{"name":"signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_signal@1.0.2\\signal\\src\\init.lua","Packages\\_Index\\nightcycle_signal@1.0.2\\signal\\default.project.json"]}]},{"name":"nightcycle_string@0.1.0","className":"Folder","children":[{"name":"string","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_string@0.1.0\\string\\src\\init.lua","Packages\\_Index\\nightcycle_string@0.1.0\\string\\default.project.json"],"children":[{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_string@0.1.0\\string\\src\\init.spec.lua"]}]}]},{"name":"nightcycle_table-util@1.1.0","className":"Folder","children":[{"name":"table-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_table-util@1.1.0\\table-util\\src\\init.lua","Packages\\_Index\\nightcycle_table-util@1.1.0\\table-util\\default.project.json"]}]},{"name":"nightcycle_vector@1.0.2","className":"Folder","children":[{"name":"vector","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_vector@1.0.2\\vector\\src\\init.lua","Packages\\_Index\\nightcycle_vector@1.0.2\\vector\\default.project.json"]}]},{"name":"roblox_roact@1.4.4","className":"Folder","children":[{"name":"roact","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\init.lua","Packages\\_Index\\roblox_roact@1.4.4\\roact\\default.project.json"],"children":[{"name":"Binding","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Binding.lua"]},{"name":"Binding.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Binding.spec.lua"]},{"name":"Component","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.lua"]},{"name":"Component.spec","className":"Folder","children":[{"name":"context.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\context.spec.lua"]},{"name":"defaultProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\defaultProps.spec.lua"]},{"name":"didMount.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\didMount.spec.lua"]},{"name":"didUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\didUpdate.spec.lua"]},{"name":"extend.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\extend.spec.lua"]},{"name":"getDerivedStateFromProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\getDerivedStateFromProps.spec.lua"]},{"name":"getElementTraceback.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\getElementTraceback.spec.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\init.spec.lua"]},{"name":"legacyContext.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\legacyContext.spec.lua"]},{"name":"render.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\render.spec.lua"]},{"name":"setState.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\setState.spec.lua"]},{"name":"shouldUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\shouldUpdate.spec.lua"]},{"name":"validateProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\validateProps.spec.lua"]},{"name":"willUnmount.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\willUnmount.spec.lua"]},{"name":"willUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\willUpdate.spec.lua"]}]},{"name":"ComponentLifecyclePhase","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ComponentLifecyclePhase.lua"]},{"name":"Config","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Config.lua"]},{"name":"Config.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Config.spec.lua"]},{"name":"ElementKind","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementKind.lua"]},{"name":"ElementKind.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementKind.spec.lua"]},{"name":"ElementUtils","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementUtils.lua"]},{"name":"ElementUtils.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementUtils.spec.lua"]},{"name":"GlobalConfig","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\GlobalConfig.lua"]},{"name":"GlobalConfig.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\GlobalConfig.spec.lua"]},{"name":"Logging","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Logging.lua"]},{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\None.lua"]},{"name":"NoopRenderer","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\NoopRenderer.lua"]},{"name":"Portal","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Portal.lua"]},{"name":"PropMarkers","className":"Folder","children":[{"name":"Change","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Change.lua"]},{"name":"Change.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Change.spec.lua"]},{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Children.lua"]},{"name":"Event","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Event.lua"]},{"name":"Event.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Event.spec.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Ref.lua"]}]},{"name":"PureComponent","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PureComponent.lua"]},{"name":"PureComponent.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PureComponent.spec.lua"]},{"name":"RobloxRenderer","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\RobloxRenderer.lua"]},{"name":"RobloxRenderer.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\RobloxRenderer.spec.lua"]},{"name":"SingleEventManager","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\SingleEventManager.lua"]},{"name":"SingleEventManager.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\SingleEventManager.spec.lua"]},{"name":"Symbol","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Symbol.lua"]},{"name":"Symbol.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Symbol.spec.lua"]},{"name":"Type","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Type.lua"]},{"name":"Type.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Type.spec.lua"]},{"name":"assertDeepEqual","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assertDeepEqual.lua"]},{"name":"assertDeepEqual.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assertDeepEqual.spec.lua"]},{"name":"assign","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assign.lua"]},{"name":"assign.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assign.spec.lua"]},{"name":"createContext","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createContext.lua"]},{"name":"createContext.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createContext.spec.lua"]},{"name":"createElement","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createElement.lua"]},{"name":"createElement.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createElement.spec.lua"]},{"name":"createFragment","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createFragment.lua"]},{"name":"createFragment.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createFragment.spec.lua"]},{"name":"createReconciler","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconciler.lua"]},{"name":"createReconciler.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconciler.spec.lua"]},{"name":"createReconcilerCompat","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconcilerCompat.lua"]},{"name":"createReconcilerCompat.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconcilerCompat.spec.lua"]},{"name":"createRef","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createRef.lua"]},{"name":"createRef.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createRef.spec.lua"]},{"name":"createSignal","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSignal.lua"]},{"name":"createSignal.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSignal.spec.lua"]},{"name":"createSpy","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSpy.lua"]},{"name":"createSpy.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSpy.spec.lua"]},{"name":"forwardRef","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\forwardRef.lua"]},{"name":"forwardRef.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\forwardRef.spec.lua"]},{"name":"getDefaultInstanceProperty","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\getDefaultInstanceProperty.lua"]},{"name":"getDefaultInstanceProperty.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\getDefaultInstanceProperty.spec.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\init.spec.lua"]},{"name":"internalAssert","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\internalAssert.lua"]},{"name":"invalidSetStateMessages","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\invalidSetStateMessages.lua"]},{"name":"oneChild","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\oneChild.lua"]},{"name":"oneChild.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\oneChild.spec.lua"]},{"name":"strict","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\strict.lua"]},{"name":"strict.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\strict.spec.lua"]}]}]}]},{"name":"synthetic","className":"ModuleScript","filePaths":["src\\init.luau"],"children":[{"name":"Component","className":"Folder","children":[{"name":"Button","className":"Folder","children":[{"name":"Base","className":"ModuleScript","filePaths":["src\\Component\\Button\\Base.luau"]},{"name":"ElevatedButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\ElevatedButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\ElevatedButton\\cfusion.story.luau"]}]},{"name":"FilledButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledButton\\cfusion.story.luau"]}]},{"name":"OutlinedButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedButton\\cfusion.story.luau"]}]},{"name":"TextButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\TextButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\TextButton\\cfusion.story.luau"]}]}]}]},{"name":"Config","className":"ModuleScript","filePaths":["src\\Config.luau"]},{"name":"DropShadow","className":"ModuleScript","filePaths":["src\\DropShadow\\init.luau"]},{"name":"Enums","className":"ModuleScript","filePaths":["src\\Enums.luau"]},{"name":"Sounds","className":"ModuleScript","filePaths":["src\\Sounds.luau"]},{"name":"Test","className":"Folder","children":[{"name":"Source.cfusion","className":"ModuleScript","filePaths":["src\\Test\\Source.cfusion.luau"]}]},{"name":"Types","className":"ModuleScript","filePaths":["src\\Types.luau"]},{"name":"Util","className":"ModuleScript","filePaths":["src\\Util.luau"]}]}]}]}]} \ No newline at end of file diff --git a/src/Component/Button/Base.luau b/src/Component/Button/Base.luau index 00e78e20..8c49278d 100644 --- a/src/Component/Button/Base.luau +++ b/src/Component/Button/Base.luau @@ -31,7 +31,8 @@ local LEFT_PADDING_WITH_ICON_DP = 12 local RIGHT_PADDING_WITH_ICON_DP = 16 local PADDING_BETWEEN_ELEMENTS_DP = 8 local LABEL_TEXT_ALIGNMENT = Enum.TextXAlignment.Center - +local IMAGE_SIZE = 500 +local HALF_IMAGE_SIZE = IMAGE_SIZE/2 return function ( maid: Maid, onClick: CanBeState<() -> ()>, @@ -40,9 +41,10 @@ return function ( styles: CanBeState<{[Enums.ButtonStateType]: TextStyle}>, textIcon: CanBeState, isEnabled: CanBeState, + isDropShadow: CanBeState, scale: CanBeState, sound: CanBeState -): TextButton +): ImageLabel local _fuse = ColdFusion.fuse(maid) @@ -90,153 +92,182 @@ return function ( local scaleState = _import(scale, 1) local iconState = _import(textIcon, nil :: ImageData?) :: any local soundState = _import(sound, nil :: Sound?) - local inst: TextButton = _new("TextButton")({ - Name = "TextButton", - Text = "", - BackgroundTransparency = _Computed(function(style: TextStyle): number - return style.BackgroundTransparency - end, currentStyleState), - BackgroundColor3 = _Computed(function(style: TextStyle): Color3 - return style.BackgroundColor3 - end, currentStyleState), - Active = isEnabledState, - AutomaticSize = Enum.AutomaticSize.X, - Size = _Computed(function(s: number): UDim2 - return UDim2.fromOffset(0, s * HEIGHT_DP) - end, scaleState), - Events = { - Activated = function() - if isEnabledState:Get() == false then return end - local click = onClickState:Get() - local s = soundState:Get() - if s then - SoundService:PlayLocalSound(s) - end - click() - end, - MouseButton1Down = function(inputObject: InputObject) - isPressedState:Set(true) - end, - MouseButton1Up = function(inputObject: InputObject) - isPressedState:Set(false) - end, - MouseEnter = function() - isHoveredState:Set(true) - end, - MouseLeave = function() - isHoveredState:Set(false) - end, - SelectionGained = function() - isFocusedState:Set(true) - end, - SelectionLost = function() - isFocusedState:Set(false) - end, - }, + local isDropShadowState = _import(isDropShadow, false) + + local inst: ImageLabel = _new("ImageLabel")({ + Image = "rbxassetid://15549395120", + ImageColor3 = Color3.new(0,0,0), + BackgroundTransparency = 1, + ImageTransparency = _Computed(function(style: TextStyle, isDrop: boolean): number + return if style.BackgroundTransparency == 0 and isDrop then 0 else 1 + end, currentStyleState, isDropShadowState), + ScaleType = Enum.ScaleType.Slice, + AutomaticSize = Enum.AutomaticSize.XY, + SliceCenter = Rect.new(HALF_IMAGE_SIZE, HALF_IMAGE_SIZE, HALF_IMAGE_SIZE, HALF_IMAGE_SIZE), + SliceScale = 1, Children = { - _new("UICorner")({ - CornerRadius = _Computed(function(s: number): UDim - return UDim.new(0, s * SHAPE_DP) - end, scaleState), - }), - _new("UIStroke")({ - ApplyStrokeMode = Enum.ApplyStrokeMode.Border, - Color = _Computed(function(style: TextStyle): Color3 - return style.BorderColor3 - end, currentStyleState), - LineJoinMode = Enum.LineJoinMode.Round, - Thickness = _Computed(function(s: number): number - return math.max(s*1, 1) - end, scaleState), - Transparency = _Computed(function(style: TextStyle): number - return style.BorderTransparency - end, currentStyleState), - }), _new("UIListLayout")({ - Padding = _Computed(function(s: number): UDim - return UDim.new(0, s * PADDING_BETWEEN_ELEMENTS_DP) - end, scaleState), + Padding = UDim.new(0,0), SortOrder = Enum.SortOrder.LayoutOrder, FillDirection = Enum.FillDirection.Horizontal, ItemLineAlignment = Enum.ItemLineAlignment.Center, VerticalAlignment = Enum.VerticalAlignment.Center, HorizontalAlignment = Enum.HorizontalAlignment.Center, }), - _new("TextLabel")({ - Text = textState, - TextScaled = true, - TextXAlignment = LABEL_TEXT_ALIGNMENT, - TextYAlignment = Enum.TextYAlignment.Center, - BackgroundTransparency = 1, - AutomaticSize = Enum.AutomaticSize.X, - FontFace = fontState, - LayoutOrder = 2, - TextColor3 = _Computed(function(style: TextStyle): Color3 - return style.TextColor3 + _new("UIPadding")({ + PaddingBottom = _Computed(function(s: number, isDrop: boolean): UDim + return if isDrop then UDim.new(0, s * 5) else UDim.new(0,0) + end, scaleState, isDropShadowState), + }), + _new("TextButton")({ + Name = "TextButton", + Text = "", + BackgroundTransparency = _Computed(function(style: TextStyle): number + return style.BackgroundTransparency end, currentStyleState), - TextTransparency = _Computed(function(style: TextStyle): number - return style.TextTransparency + BackgroundColor3 = _Computed(function(style: TextStyle): Color3 + return style.BackgroundColor3 end, currentStyleState), + Active = isEnabledState, + AutomaticSize = Enum.AutomaticSize.X, Size = _Computed(function(s: number): UDim2 - return UDim2.fromOffset(0, s * ICON_SIZE_DP) - end, scaleState), - }), - _new("ImageLabel")({ - Name = "Icon", - LayoutOrder = 1, - BackgroundTransparency = 1, - Visible = _Computed(function(icon: ImageData?): boolean - return icon ~= nil - end, iconState), - Image = _Computed(function(icon: ImageData?): string - return if icon then icon.Image else "" - end, iconState), - ImageColor3 = _Computed(function(icon: ImageData?, style: TextStyle?): Color3 - return if icon and style then style.TextColor3 else Color3.new(1,1,1) - end, iconState, currentStyleState), - ImageRectOffset = _Computed(function(icon: ImageData?): Vector2 - return if icon then icon.RectOffset else Vector2.zero - end, iconState), - ImageRectSize = _Computed(function(icon: ImageData?): Vector2 - return if icon then icon.RectSize else Vector2.zero - end, iconState), - ImageTransparency = _Computed(function(icon: ImageData?, style: TextStyle?): number - return if icon and style then style.TextTransparency else 1 - end, iconState, currentStyleState), - Size = _Computed(function(s: number): UDim2 - return UDim2.fromOffset(s * ICON_SIZE_DP, s * ICON_SIZE_DP) - end, scaleState), - }), - _new("UIPadding")({ - PaddingLeft = _Computed(function(s: number, icon: ImageData?): UDim - if icon then - return UDim.new(0, LEFT_PADDING_WITH_ICON_DP * s) - else - return UDim.new(0, LEFT_RIGHT_PADDING_DP * s) - end - end, scaleState, iconState), - PaddingRight = _Computed(function(s: number, icon: ImageData?): UDim - if icon then - return UDim.new(0, RIGHT_PADDING_WITH_ICON_DP * s) - else - return UDim.new(0, LEFT_RIGHT_PADDING_DP * s) - end - end, scaleState, iconState), - PaddingTop = _Computed(function(s: number): UDim - return UDim.new(0, s * (HEIGHT_DP-ICON_SIZE_DP) / 2) - end, scaleState), - PaddingBottom = _Computed(function(s: number): UDim - return UDim.new(0, s * (HEIGHT_DP-ICON_SIZE_DP) / 2) + return UDim2.fromOffset(0, s * HEIGHT_DP) end, scaleState), - }), - _new("UISizeConstraint")({ - MaxSize = Vector2.new(math.huge, math.huge), - MinSize = _Computed(function(s: number): Vector2 - return Vector2.new(s * CONTAINER_WIDTH_MIN_DP, 0) - end, scaleState), - }), + Events = { + Activated = function() + if isEnabledState:Get() == false then return end + local click = onClickState:Get() + local s = soundState:Get() + if s then + SoundService:PlayLocalSound(s) + end + click() + end, + MouseButton1Down = function(inputObject: InputObject) + isPressedState:Set(true) + end, + MouseButton1Up = function(inputObject: InputObject) + isPressedState:Set(false) + end, + MouseEnter = function() + isHoveredState:Set(true) + end, + MouseLeave = function() + isHoveredState:Set(false) + end, + SelectionGained = function() + isFocusedState:Set(true) + end, + SelectionLost = function() + isFocusedState:Set(false) + end, + }, + Children = { + _new("UICorner")({ + CornerRadius = _Computed(function(s: number): UDim + return UDim.new(0, s * SHAPE_DP) + end, scaleState), + }), + _new("UIStroke")({ + ApplyStrokeMode = Enum.ApplyStrokeMode.Border, + Color = _Computed(function(style: TextStyle): Color3 + return style.BorderColor3 + end, currentStyleState), + LineJoinMode = Enum.LineJoinMode.Round, + Thickness = _Computed(function(s: number): number + return math.max(s*1, 1) + end, scaleState), + Transparency = _Computed(function(style: TextStyle): number + return style.BorderTransparency + end, currentStyleState), + }), + _new("UIListLayout")({ + Padding = _Computed(function(s: number): UDim + return UDim.new(0, s * PADDING_BETWEEN_ELEMENTS_DP) + end, scaleState), + SortOrder = Enum.SortOrder.LayoutOrder, + FillDirection = Enum.FillDirection.Horizontal, + ItemLineAlignment = Enum.ItemLineAlignment.Center, + VerticalAlignment = Enum.VerticalAlignment.Center, + HorizontalAlignment = Enum.HorizontalAlignment.Center, + }), + _new("TextLabel")({ + Text = textState, + TextScaled = true, + TextXAlignment = LABEL_TEXT_ALIGNMENT, + TextYAlignment = Enum.TextYAlignment.Center, + BackgroundTransparency = 1, + AutomaticSize = Enum.AutomaticSize.X, + FontFace = fontState, + LayoutOrder = 2, + TextColor3 = _Computed(function(style: TextStyle): Color3 + return style.TextColor3 + end, currentStyleState), + TextTransparency = _Computed(function(style: TextStyle): number + return style.TextTransparency + end, currentStyleState), + Size = _Computed(function(s: number): UDim2 + return UDim2.fromOffset(0, s * ICON_SIZE_DP) + end, scaleState), + }), + _new("ImageLabel")({ + Name = "Icon", + LayoutOrder = 1, + BackgroundTransparency = 1, + Visible = _Computed(function(icon: ImageData?): boolean + return icon ~= nil + end, iconState), + Image = _Computed(function(icon: ImageData?): string + return if icon then icon.Image else "" + end, iconState), + ImageColor3 = _Computed(function(icon: ImageData?, style: TextStyle?): Color3 + return if icon and style then style.TextColor3 else Color3.new(1,1,1) + end, iconState, currentStyleState), + ImageRectOffset = _Computed(function(icon: ImageData?): Vector2 + return if icon then icon.RectOffset else Vector2.zero + end, iconState), + ImageRectSize = _Computed(function(icon: ImageData?): Vector2 + return if icon then icon.RectSize else Vector2.zero + end, iconState), + ImageTransparency = _Computed(function(icon: ImageData?, style: TextStyle?): number + return if icon and style then style.TextTransparency else 1 + end, iconState, currentStyleState), + Size = _Computed(function(s: number): UDim2 + return UDim2.fromOffset(s * ICON_SIZE_DP, s * ICON_SIZE_DP) + end, scaleState), + }), + _new("UIPadding")({ + PaddingLeft = _Computed(function(s: number, icon: ImageData?): UDim + if icon then + return UDim.new(0, LEFT_PADDING_WITH_ICON_DP * s) + else + return UDim.new(0, LEFT_RIGHT_PADDING_DP * s) + end + end, scaleState, iconState), + PaddingRight = _Computed(function(s: number, icon: ImageData?): UDim + if icon then + return UDim.new(0, RIGHT_PADDING_WITH_ICON_DP * s) + else + return UDim.new(0, LEFT_RIGHT_PADDING_DP * s) + end + end, scaleState, iconState), + PaddingTop = _Computed(function(s: number): UDim + return UDim.new(0, s * (HEIGHT_DP-ICON_SIZE_DP) / 2) + end, scaleState), + PaddingBottom = _Computed(function(s: number): UDim + return UDim.new(0, s * (HEIGHT_DP-ICON_SIZE_DP) / 2) + end, scaleState), + }), + _new("UISizeConstraint")({ + MaxSize = Vector2.new(math.huge, math.huge), + MinSize = _Computed(function(s: number): Vector2 + return Vector2.new(s * CONTAINER_WIDTH_MIN_DP, 0) + end, scaleState), + }), + }, + }) :: TextButton }, - }) :: TextButton + }) :: ImageLabel return inst end \ No newline at end of file diff --git a/src/Component/Button/ElevatedButton/cfusion.story.luau b/src/Component/Button/ElevatedButton/cfusion.story.luau new file mode 100644 index 00000000..d4906360 --- /dev/null +++ b/src/Component/Button/ElevatedButton/cfusion.story.luau @@ -0,0 +1,128 @@ +--!strict +local _Package = script.Parent.Parent.Parent.Parent +local _Packages = _Package.Parent +-- Services +-- Packages +local Maid = require(_Packages:WaitForChild("Maid")) +local MaterialIcons = require(_Packages:WaitForChild("MaterialIcons")) + +-- Modules +local Types = require(_Package:WaitForChild("Types")) +-- Types +-- Constants +local SCALE = 1 +-- Variables +-- References +local Icons = MaterialIcons.default.dp_48.scale_1 + +-- Class +return function(frame: Frame) + local maid = Maid.new() + task.spawn(function() + local function makeHalfFrame( + isDarkMode: boolean, + color: Color3 + ): Frame + + local halfFrame = maid:GiveTask(Instance.new("Frame")) + halfFrame.BackgroundColor3 = if isDarkMode then Color3.new(0.15,0.15,0.15) else Color3.new(0.85, 0.85, 0.85) + + local listLayout = maid:GiveTask(Instance.new("UIListLayout")) + listLayout.FillDirection = Enum.FillDirection.Vertical + listLayout.Padding = UDim.new(0, 10) + listLayout.VerticalAlignment = Enum.VerticalAlignment.Center + listLayout.HorizontalAlignment = Enum.HorizontalAlignment.Center + listLayout.Parent = halfFrame + + local Module = require(script.Parent) + local theme = Types.newThemeData( + 1, + isDarkMode, + SCALE, + Font.fromEnum(Enum.Font.SourceSans), + color, + halfFrame.BackgroundColor3 + ) + + do + local button = maid:GiveTask(Module.cfusion( + function() + print("click") + end, + "Button", + theme, + nil, + nil + )) + button.Parent = halfFrame + end + + do + local button = maid:GiveTask(Module.cfusion( + function() + print("click") + end, + "Disabled", + theme, + nil, + false + )) + button.Parent = halfFrame + end + + do + local button = maid:GiveTask(Module.cfusion( + function() + print("click") + end, + "Icon", + theme, + Types.newImageData( + Icons.voice_chat.Image, + Icons.voice_chat.ImageRectOffset, + Icons.voice_chat.ImageRectSize + ), + true + )) + button.Parent = halfFrame + end + + return halfFrame + end + + local COLORS: {[number]: Color3} = { + Color3.fromHSV(0, 0.9, 0.8), + Color3.fromHSV(0, 0.25, 0.8), + Color3.fromHSV(0, 0.9, 0.5), + Color3.fromHSV(0.6, 0.9, 0.7), + Color3.fromHSV(0.35, 0.9, 0.7), + Color3.fromHSV(0.1, 0.9, 0.7), + } + + for i, color in ipairs(COLORS) do + local x = (i-1)/(#COLORS) + local width = 1/(#COLORS) + local dark = makeHalfFrame( + true, + color + ) + + dark.Size = UDim2.fromScale(width, 0.5) + dark.Position = UDim2.fromScale(x, 0.5) + dark.Parent = frame + + local bright = makeHalfFrame( + false, + color + ) + bright.Size = UDim2.fromScale(width, 0.5) + bright.Position = UDim2.fromScale(x, 0) + bright.Parent = frame + + end + + end) + return function() + maid:Destroy() + end +end \ No newline at end of file diff --git a/src/Component/Button/ElevatedButton/init.luau b/src/Component/Button/ElevatedButton/init.luau new file mode 100644 index 00000000..e5c5b201 --- /dev/null +++ b/src/Component/Button/ElevatedButton/init.luau @@ -0,0 +1,184 @@ +--!strict +local _Package = script.Parent.Parent.Parent +local _Packages = _Package.Parent +-- Services + +-- Packages +local Maid = require(_Packages:WaitForChild("Maid")) +local ColdFusion = require(_Packages:WaitForChild("ColdFusion")) + +-- Modules +local Sounds = require(_Package:WaitForChild("Sounds")) +local Enums = require(_Package:WaitForChild("Enums")) +local Types = require(_Package:WaitForChild("Types")) +local Config = require(_Package:WaitForChild("Config")) +local Util = require(_Package:WaitForChild("Util")) +local Base = require(script.Parent:WaitForChild("Base")) + +-- Types +type Maid = Maid.Maid +type State = ColdFusion.State +type ValueState = ColdFusion.ValueState +type CanBeState = ColdFusion.CanBeState +type TextStyle = Types.TextStyle +type ImageData = Types.ImageData +type ThemeData = Types.ThemeData +-- Constants +local DEFAULT_VOLUME = Config.Sound.Volume +local DISABLE_TRANSPARENCY = Config.Transparency.Text.Disabled +local DISABLE_BACK_TRANS = Config.Transparency.Background.Disabled + +-- Variables +-- References +-- Private Functions + + +-- Class +local Interface = {} + +function Interface.cfusion( + onClick: CanBeState<() -> ()>, + text: CanBeState, + theme: CanBeState, + icon: CanBeState?, + isEnabled: CanBeState? +): ImageLabel + local maid = Maid.new() + + local _fuse = ColdFusion.fuse(maid) + + local _new = _fuse.new + local _bind = _fuse.bind + local _clone = _fuse.clone + local _import = _fuse.import + + local _Value = _fuse.Value + local _Computed = _fuse.Computed + + local onClickState = _import(onClick, function() end) + local textState = _import(text, "") + local themeState = _import(theme, Types.newThemeData( + 1, + false, + 1, + Font.fromEnum(Enum.Font.SourceSansSemibold), + Color3.fromHSV(0.8, 0.4, 0.8) + )) + + local sound = maid:GiveTask(Instance.new("Sound")) + sound.Volume = DEFAULT_VOLUME + sound.SoundId = Sounds.ui_tap_variant_01 + + local styles = _Computed(function(thm: ThemeData): {[Enums.ButtonStateType]: TextStyle} + local backColor: Color3? + local textColor: Color3? + + if thm.IsDarkMode then + backColor = Util.getReadableColor( + thm.Color3, + if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.DARK_SURFACE + ) + assert(backColor) + + textColor = Util.DARK_SURFACE + else + backColor = Util.getReadableColor( + thm.Color3, + if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.LIGHT_SURFACE + ) + assert(backColor) + + textColor = Util.LIGHT_SURFACE + end + assert(backColor) + assert(textColor) + + backColor = Util.getElevatedColor( + backColor, + thm.Elevation, + thm.IsDarkMode + ) + + textColor = Util.getElevatedColor( + textColor, + thm.Elevation, + thm.IsDarkMode + ) + + local disableBackColor = (function(): Color3 + local h,s,v = backColor:ToHSV() + return Color3.fromHSV(h,s*0,v) + end)() + + local data = { + [Enums.ButtonStateType.Enabled] = Types.newTextStyle( + textColor, + 0, + backColor, + 0, + textColor, + 1 + ), + [Enums.ButtonStateType.Disabled] = Types.newTextStyle( + (function(): Color3 + if thm.IsDarkMode then + return Util.LIGHT_SURFACE + else + return Util.DARK_SURFACE + end + end)(), + DISABLE_TRANSPARENCY, + disableBackColor, + DISABLE_BACK_TRANS, + textColor, + 1 + ), + [Enums.ButtonStateType.Focused] = Types.newTextStyle( + textColor, + 0, + backColor, + 0, + textColor, + 1 + ), + [Enums.ButtonStateType.Hovered] = Types.newTextStyle( + textColor, + 0, + backColor, + 0, + textColor, + 1 + ), + [Enums.ButtonStateType.Pressed] = Types.newTextStyle( + textColor, + 0, + backColor, + 0, + textColor, + 1 + ), + } + return data + end, themeState) + + local button = Base( + maid, + onClickState, + textState, + _Computed(function(t: ThemeData): Font + return t.Font + end, themeState), + styles, + icon, + if isEnabled == nil then true else isEnabled, + true, + _Computed(function(t: ThemeData): number + return t.Scale + end, themeState), + sound + ) + maid.bind(button) + return button +end + +return Interface \ No newline at end of file diff --git a/src/Component/Button/FilledButton/init.luau b/src/Component/Button/FilledButton/init.luau index c5aa3e54..126fd4be 100644 --- a/src/Component/Button/FilledButton/init.luau +++ b/src/Component/Button/FilledButton/init.luau @@ -25,9 +25,6 @@ type ImageData = Types.ImageData type ThemeData = Types.ThemeData -- Constants local DEFAULT_VOLUME = Config.Sound.Volume -local HOVER_TRANSPARENCY = Config.Transparency.Background.Hovered -local FOCUS_TRANSPARENCY = Config.Transparency.Background.Focused -local PRESS_TRANSPARENCY = Config.Transparency.Background.Pressed local DISABLE_TRANSPARENCY = Config.Transparency.Text.Disabled local DISABLE_BACK_TRANS = Config.Transparency.Background.Disabled @@ -45,7 +42,7 @@ function Interface.cfusion( theme: CanBeState, icon: CanBeState?, isEnabled: CanBeState? -): TextButton +): ImageLabel local maid = Maid.new() local _fuse = ColdFusion.fuse(maid) @@ -174,6 +171,7 @@ function Interface.cfusion( styles, icon, if isEnabled == nil then true else isEnabled, + false, _Computed(function(t: ThemeData): number return t.Scale end, themeState), diff --git a/src/Component/Button/OutlinedButton/init.luau b/src/Component/Button/OutlinedButton/init.luau index aa01ab4a..589a7e15 100644 --- a/src/Component/Button/OutlinedButton/init.luau +++ b/src/Component/Button/OutlinedButton/init.luau @@ -44,7 +44,7 @@ function Interface.cfusion( theme: CanBeState, icon: CanBeState?, isEnabled: CanBeState? -): TextButton +): ImageLabel local maid = Maid.new() local _fuse = ColdFusion.fuse(maid) @@ -165,6 +165,7 @@ function Interface.cfusion( styles, icon, if isEnabled == nil then true else isEnabled, + false, _Computed(function(t: ThemeData): number return t.Scale end, themeState), diff --git a/src/Component/Button/TextButton/init.luau b/src/Component/Button/TextButton/init.luau index 3fc30f91..fcce9196 100644 --- a/src/Component/Button/TextButton/init.luau +++ b/src/Component/Button/TextButton/init.luau @@ -44,7 +44,7 @@ function Interface.cfusion( theme: CanBeState, icon: CanBeState?, isEnabled: CanBeState? -): TextButton +): ImageLabel local maid = Maid.new() local _fuse = ColdFusion.fuse(maid) @@ -161,6 +161,7 @@ function Interface.cfusion( styles, icon, if isEnabled == nil then true else isEnabled, + false, _Computed(function(t: ThemeData): number return t.Scale end, themeState), diff --git a/src/DropShadow/init.luau b/src/DropShadow/init.luau deleted file mode 100644 index ebb6afd5..00000000 --- a/src/DropShadow/init.luau +++ /dev/null @@ -1,55 +0,0 @@ ---!strict -local _Package = script.Parent -local _Packages = _Package.Parent --- Services --- Packages -local Maid = require(_Packages:WaitForChild("Maid")) -local ColdFusion = require(_Packages:WaitForChild("ColdFusion")) - --- Modules --- Types --- Constants -local IMAGE_SIZE = 500 -local HALF_IMAGE_SIZE = IMAGE_SIZE/2 --- Variables --- References --- Private Functions --- Class --- Types -type CanBeState = ColdFusion.CanBeState -type ValueState = ColdFusion.ValueState -type State = ColdFusion.State -type Maid = Maid.Maid - - -return function(cornerRadius: CanBeState, transparency: CanBeState): ImageLabel - local maid = Maid.new() - - local _fuse = ColdFusion.fuse(maid) - - local _new = _fuse.new - local _bind = _fuse.bind - local _clone = _fuse.clone - local _import = _fuse.import - - local _Value = _fuse.Value - local _Computed = _fuse.Computed - - local cornerRadiusState = _import(cornerRadius, 1) - - local inst = _new("ImageLabel")({ - Image = "rbxassetid://15549395120", - ImageColor3 = Color3.new(0,0,0), - BackgroundTransparency = 1, - ImageTransparency = transparency, - ScaleType = Enum.ScaleType.Slice, - SliceCenter = Rect.new(HALF_IMAGE_SIZE, HALF_IMAGE_SIZE, HALF_IMAGE_SIZE, HALF_IMAGE_SIZE), - SliceScale = _Computed(function(radius: number): number - return math.clamp(radius/HALF_IMAGE_SIZE, 0, 1) - end, cornerRadiusState), - }) :: ImageLabel - - maid.bind(inst) - - return inst -end \ No newline at end of file From d21a9bcd46b24ac5ab10f412e97c68738ed42486 Mon Sep 17 00:00:00 2001 From: Nightcycle <77173389+nightcycle@users.noreply.github.com> Date: Tue, 5 Dec 2023 18:19:09 -0500 Subject: [PATCH 07/57] Added FAB buttons --- sourcemap.json | 2 +- src/Component/Button/Base.luau | 37 ++-- .../Button/ExtendedFAB/cfusion.story.luau | 128 ++++++++++++ src/Component/Button/ExtendedFAB/init.luau | 186 ++++++++++++++++++ src/Component/Button/FAB/cfusion.story.luau | 127 ++++++++++++ src/Component/Button/FAB/init.luau | 184 +++++++++++++++++ src/Component/Button/FilledButton/init.luau | 10 +- 7 files changed, 655 insertions(+), 19 deletions(-) create mode 100644 src/Component/Button/ExtendedFAB/cfusion.story.luau create mode 100644 src/Component/Button/ExtendedFAB/init.luau create mode 100644 src/Component/Button/FAB/cfusion.story.luau create mode 100644 src/Component/Button/FAB/init.luau diff --git a/sourcemap.json b/sourcemap.json index 0068da39..72873c9a 100644 --- a/sourcemap.json +++ b/sourcemap.json @@ -1 +1 @@ -{"name":"synthetic-test","className":"DataModel","filePaths":["dev.project.json"],"children":[{"name":"ReplicatedStorage","className":"ReplicatedStorage","children":[{"name":"Packages","className":"Folder","children":[{"name":"ColdFusion","className":"ModuleScript","filePaths":["Packages\\ColdFusion.lua"]},{"name":"CurveUtil","className":"ModuleScript","filePaths":["Packages\\CurveUtil.lua"]},{"name":"Format","className":"ModuleScript","filePaths":["Packages\\Format.lua"]},{"name":"Fusion","className":"ModuleScript","filePaths":["Packages\\Fusion.lua"]},{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\Maid.lua"]},{"name":"MaterialIcons","className":"ModuleScript","filePaths":["Packages\\MaterialIcons.lua"]},{"name":"MeshUtil","className":"ModuleScript","filePaths":["Packages\\MeshUtil.lua"]},{"name":"Roact","className":"ModuleScript","filePaths":["Packages\\Roact.lua"]},{"name":"Signal","className":"ModuleScript","filePaths":["Packages\\Signal.lua"]},{"name":"_Index","className":"Folder","children":[{"name":"elttob_fusion@0.2.0","className":"Folder","children":[{"name":"fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\init.lua","Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\default.project.json"],"children":[{"name":"Animation","className":"Folder","children":[{"name":"Spring","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\Spring.lua"]},{"name":"SpringScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\SpringScheduler.lua"]},{"name":"Tween","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\Tween.lua"]},{"name":"TweenScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\TweenScheduler.lua"]},{"name":"getTweenRatio","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\getTweenRatio.lua"]},{"name":"lerpType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\lerpType.lua"]},{"name":"packType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\packType.lua"]},{"name":"springCoefficients","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\springCoefficients.lua"]},{"name":"unpackType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\unpackType.lua"]}]},{"name":"Colour","className":"Folder","children":[{"name":"Oklab","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Colour\\Oklab.lua"]}]},{"name":"Dependencies","className":"Folder","children":[{"name":"captureDependencies","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\captureDependencies.lua"]},{"name":"initDependency","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\initDependency.lua"]},{"name":"sharedState","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\sharedState.lua"]},{"name":"updateAll","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\updateAll.lua"]},{"name":"useDependency","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\useDependency.lua"]}]},{"name":"Instances","className":"Folder","children":[{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Children.lua"]},{"name":"Cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Cleanup.lua"]},{"name":"Hydrate","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Hydrate.lua"]},{"name":"New","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\New.lua"]},{"name":"OnChange","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\OnChange.lua"]},{"name":"OnEvent","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\OnEvent.lua"]},{"name":"Out","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Out.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Ref.lua"]},{"name":"applyInstanceProps","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\applyInstanceProps.lua"]},{"name":"defaultProps","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\defaultProps.lua"]}]},{"name":"Logging","className":"Folder","children":[{"name":"logError","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logError.lua"]},{"name":"logErrorNonFatal","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logErrorNonFatal.lua"]},{"name":"logWarn","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logWarn.lua"]},{"name":"messages","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\messages.lua"]},{"name":"parseError","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\parseError.lua"]}]},{"name":"PubTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\PubTypes.lua"]},{"name":"State","className":"Folder","children":[{"name":"Computed","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Computed.lua"]},{"name":"ForKeys","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForKeys.lua"]},{"name":"ForPairs","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForPairs.lua"]},{"name":"ForValues","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForValues.lua"]},{"name":"Observer","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Observer.lua"]},{"name":"Value","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Value.lua"]},{"name":"unwrap","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\unwrap.lua"]}]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Types.lua"]},{"name":"Utility","className":"Folder","children":[{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\None.lua"]},{"name":"cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\cleanup.lua"]},{"name":"doNothing","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\doNothing.lua"]},{"name":"isSimilar","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\isSimilar.lua"]},{"name":"needsDestruction","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\needsDestruction.lua"]},{"name":"restrictRead","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\restrictRead.lua"]},{"name":"xtypeof","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\xtypeof.lua"]}]}]}]},{"name":"nightcycle_cold-fusion@9.0.7","className":"Folder","children":[{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\Maid.lua"]},{"name":"ServiceProxy","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\ServiceProxy.lua"]},{"name":"Signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\Signal.lua"]},{"name":"TableUtil","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\TableUtil.lua"]},{"name":"cold-fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\init.luau","Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\default.project.json"],"children":[{"name":"Fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\init.lua"],"children":[{"name":"Animation","className":"Folder","children":[{"name":"Spring","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\Spring.lua"]},{"name":"SpringScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\SpringScheduler.lua"]},{"name":"Tween","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\Tween.lua"]},{"name":"TweenScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\TweenScheduler.lua"]},{"name":"getTweenRatio","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\getTweenRatio.lua"]},{"name":"lerpType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\lerpType.lua"]},{"name":"packType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\packType.lua"]},{"name":"springCoefficients","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\springCoefficients.lua"]},{"name":"unpackType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\unpackType.lua"]}]},{"name":"Colour","className":"Folder","children":[{"name":"Oklab","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Colour\\Oklab.lua"]}]},{"name":"Instances","className":"Folder","children":[{"name":"Attribute","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Attribute.lua"]},{"name":"AttributeChange","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\AttributeChange.lua"]},{"name":"AttributeOut","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\AttributeOut.lua"]},{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Children.lua"]},{"name":"Cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Cleanup.lua"]},{"name":"Hydrate","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Hydrate.lua"]},{"name":"New","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\New.lua"]},{"name":"OnChange","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\OnChange.lua"]},{"name":"OnEvent","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\OnEvent.lua"]},{"name":"Out","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Out.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Ref.lua"]},{"name":"applyInstanceProps","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\applyInstanceProps.lua"]},{"name":"defaultProps","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\defaultProps.lua"]}]},{"name":"Logging","className":"Folder","children":[{"name":"logError","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logError.lua"]},{"name":"logErrorNonFatal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logErrorNonFatal.lua"]},{"name":"logWarn","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logWarn.lua"]},{"name":"messages","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\messages.lua"]},{"name":"parseError","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\parseError.lua"]}]},{"name":"PubTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\PubTypes.lua"]},{"name":"State","className":"Folder","children":[{"name":"Computed","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Computed.lua"]},{"name":"ForKeys","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForKeys.lua"]},{"name":"ForPairs","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForPairs.lua"]},{"name":"ForValues","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForValues.lua"]},{"name":"Observer","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Observer.lua"]},{"name":"Value","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Value.lua"]},{"name":"isState","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\isState.lua"]},{"name":"makeUseCallback","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\makeUseCallback.lua"]},{"name":"peek","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\peek.lua"]},{"name":"updateAll","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\updateAll.lua"]}]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Types.lua"]},{"name":"Utility","className":"Folder","children":[{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\None.lua"]},{"name":"cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\cleanup.lua"]},{"name":"doNothing","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\doNothing.lua"]},{"name":"isSimilar","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\isSimilar.lua"]},{"name":"needsDestruction","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\needsDestruction.lua"]},{"name":"restrictRead","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\restrictRead.lua"]},{"name":"xtypeof","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\xtypeof.lua"]}]}]},{"name":"InstanceTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\InstanceTypes.luau"]},{"name":"Interface","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Interface.luau"]},{"name":"Test.story","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Test.story.luau"]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Types.luau"]},{"name":"Util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Util.luau"]}]}]},{"name":"nightcycle_curve-util@1.0.0","className":"Folder","children":[{"name":"Vector","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\Vector.lua"]},{"name":"curve-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\init.lua","Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\default.project.json"],"children":[{"name":"Ease","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\Ease.lua"]},{"name":"Lerp","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\Lerp.lua"]}]}]},{"name":"nightcycle_format@0.1.3","className":"Folder","children":[{"name":"format","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\init.lua","Packages\\_Index\\nightcycle_format@0.1.3\\format\\default.project.json"],"children":[{"name":"Emoji","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\Emoji.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\init.spec.lua"]}]},{"name":"maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\maid.lua"]},{"name":"signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\signal.lua"]},{"name":"string","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\string.lua"]}]},{"name":"nightcycle_geometry-util@1.1.1","className":"Folder","children":[{"name":"geometry-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\init.lua","Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\default.project.json"],"children":[{"name":"Earcut","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\Earcut\\init.lua"],"children":[{"name":"ZeroArray","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\Earcut\\ZeroArray.lua"]}]}]}]},{"name":"nightcycle_maid@1.1.4","className":"Folder","children":[{"name":"maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\init.lua","Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\default.project.json"],"children":[{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\Maid.lua"]},{"name":"MaidTaskUtils","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\MaidTaskUtils.lua"]}]}]},{"name":"nightcycle_material-icons@1.0.1","className":"Folder","children":[{"name":"material-icons","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\init.luau","Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\default.project.json"],"children":[{"name":"Default_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_1.luau"]},{"name":"Default_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_2.luau"]},{"name":"Default_18_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_3.luau"]},{"name":"Default_18_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_4.luau"]},{"name":"Default_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_1.luau"]},{"name":"Default_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_2.luau"]},{"name":"Default_24_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_3.luau"]},{"name":"Default_24_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_4.luau"]},{"name":"Default_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_1.luau"]},{"name":"Default_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_2.luau"]},{"name":"Default_36_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_3.luau"]},{"name":"Default_36_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_4.luau"]},{"name":"Default_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_1.luau"]},{"name":"Default_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_2.luau"]},{"name":"Default_48_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_3.luau"]},{"name":"Default_48_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_4.luau"]},{"name":"Outlined_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_18_1.luau"]},{"name":"Outlined_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_18_2.luau"]},{"name":"Outlined_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_24_1.luau"]},{"name":"Outlined_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_24_2.luau"]},{"name":"Outlined_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_36_1.luau"]},{"name":"Outlined_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_36_2.luau"]},{"name":"Outlined_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_48_1.luau"]},{"name":"Outlined_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_48_2.luau"]},{"name":"Round_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_18_1.luau"]},{"name":"Round_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_18_2.luau"]},{"name":"Round_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_24_1.luau"]},{"name":"Round_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_24_2.luau"]},{"name":"Round_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_36_1.luau"]},{"name":"Round_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_36_2.luau"]},{"name":"Round_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_48_1.luau"]},{"name":"Round_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_48_2.luau"]},{"name":"Sharp_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_18_1.luau"]},{"name":"Sharp_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_18_2.luau"]},{"name":"Sharp_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_24_1.luau"]},{"name":"Sharp_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_24_2.luau"]},{"name":"Sharp_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_36_1.luau"]},{"name":"Sharp_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_36_2.luau"]},{"name":"Sharp_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_48_1.luau"]},{"name":"Sharp_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_48_2.luau"]},{"name":"TwoTone_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_18_1.luau"]},{"name":"TwoTone_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_18_2.luau"]},{"name":"TwoTone_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_24_1.luau"]},{"name":"TwoTone_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_24_2.luau"]},{"name":"TwoTone_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_36_1.luau"]},{"name":"TwoTone_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_36_2.luau"]},{"name":"TwoTone_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_48_1.luau"]},{"name":"TwoTone_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_48_2.luau"]}]}]},{"name":"nightcycle_mesh-util@1.0.3","className":"Folder","children":[{"name":"GeometryUtil","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\GeometryUtil.lua"]},{"name":"mesh-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\init.lua","Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\default.project.json"],"children":[{"name":"CornerWedgePart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\CornerWedgePart.lua"]},{"name":"Part","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\Part.lua"]},{"name":"TetraPart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\TetraPart.lua"]},{"name":"WedgePart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\WedgePart.lua"]}]}]},{"name":"nightcycle_service-proxy@1.0.0","className":"Folder","children":[{"name":"service-proxy","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_service-proxy@1.0.0\\service-proxy\\src\\init.lua","Packages\\_Index\\nightcycle_service-proxy@1.0.0\\service-proxy\\default.project.json"]}]},{"name":"nightcycle_signal@1.0.2","className":"Folder","children":[{"name":"signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_signal@1.0.2\\signal\\src\\init.lua","Packages\\_Index\\nightcycle_signal@1.0.2\\signal\\default.project.json"]}]},{"name":"nightcycle_string@0.1.0","className":"Folder","children":[{"name":"string","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_string@0.1.0\\string\\src\\init.lua","Packages\\_Index\\nightcycle_string@0.1.0\\string\\default.project.json"],"children":[{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_string@0.1.0\\string\\src\\init.spec.lua"]}]}]},{"name":"nightcycle_table-util@1.1.0","className":"Folder","children":[{"name":"table-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_table-util@1.1.0\\table-util\\src\\init.lua","Packages\\_Index\\nightcycle_table-util@1.1.0\\table-util\\default.project.json"]}]},{"name":"nightcycle_vector@1.0.2","className":"Folder","children":[{"name":"vector","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_vector@1.0.2\\vector\\src\\init.lua","Packages\\_Index\\nightcycle_vector@1.0.2\\vector\\default.project.json"]}]},{"name":"roblox_roact@1.4.4","className":"Folder","children":[{"name":"roact","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\init.lua","Packages\\_Index\\roblox_roact@1.4.4\\roact\\default.project.json"],"children":[{"name":"Binding","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Binding.lua"]},{"name":"Binding.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Binding.spec.lua"]},{"name":"Component","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.lua"]},{"name":"Component.spec","className":"Folder","children":[{"name":"context.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\context.spec.lua"]},{"name":"defaultProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\defaultProps.spec.lua"]},{"name":"didMount.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\didMount.spec.lua"]},{"name":"didUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\didUpdate.spec.lua"]},{"name":"extend.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\extend.spec.lua"]},{"name":"getDerivedStateFromProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\getDerivedStateFromProps.spec.lua"]},{"name":"getElementTraceback.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\getElementTraceback.spec.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\init.spec.lua"]},{"name":"legacyContext.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\legacyContext.spec.lua"]},{"name":"render.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\render.spec.lua"]},{"name":"setState.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\setState.spec.lua"]},{"name":"shouldUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\shouldUpdate.spec.lua"]},{"name":"validateProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\validateProps.spec.lua"]},{"name":"willUnmount.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\willUnmount.spec.lua"]},{"name":"willUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\willUpdate.spec.lua"]}]},{"name":"ComponentLifecyclePhase","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ComponentLifecyclePhase.lua"]},{"name":"Config","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Config.lua"]},{"name":"Config.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Config.spec.lua"]},{"name":"ElementKind","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementKind.lua"]},{"name":"ElementKind.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementKind.spec.lua"]},{"name":"ElementUtils","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementUtils.lua"]},{"name":"ElementUtils.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementUtils.spec.lua"]},{"name":"GlobalConfig","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\GlobalConfig.lua"]},{"name":"GlobalConfig.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\GlobalConfig.spec.lua"]},{"name":"Logging","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Logging.lua"]},{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\None.lua"]},{"name":"NoopRenderer","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\NoopRenderer.lua"]},{"name":"Portal","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Portal.lua"]},{"name":"PropMarkers","className":"Folder","children":[{"name":"Change","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Change.lua"]},{"name":"Change.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Change.spec.lua"]},{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Children.lua"]},{"name":"Event","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Event.lua"]},{"name":"Event.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Event.spec.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Ref.lua"]}]},{"name":"PureComponent","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PureComponent.lua"]},{"name":"PureComponent.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PureComponent.spec.lua"]},{"name":"RobloxRenderer","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\RobloxRenderer.lua"]},{"name":"RobloxRenderer.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\RobloxRenderer.spec.lua"]},{"name":"SingleEventManager","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\SingleEventManager.lua"]},{"name":"SingleEventManager.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\SingleEventManager.spec.lua"]},{"name":"Symbol","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Symbol.lua"]},{"name":"Symbol.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Symbol.spec.lua"]},{"name":"Type","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Type.lua"]},{"name":"Type.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Type.spec.lua"]},{"name":"assertDeepEqual","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assertDeepEqual.lua"]},{"name":"assertDeepEqual.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assertDeepEqual.spec.lua"]},{"name":"assign","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assign.lua"]},{"name":"assign.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assign.spec.lua"]},{"name":"createContext","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createContext.lua"]},{"name":"createContext.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createContext.spec.lua"]},{"name":"createElement","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createElement.lua"]},{"name":"createElement.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createElement.spec.lua"]},{"name":"createFragment","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createFragment.lua"]},{"name":"createFragment.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createFragment.spec.lua"]},{"name":"createReconciler","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconciler.lua"]},{"name":"createReconciler.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconciler.spec.lua"]},{"name":"createReconcilerCompat","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconcilerCompat.lua"]},{"name":"createReconcilerCompat.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconcilerCompat.spec.lua"]},{"name":"createRef","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createRef.lua"]},{"name":"createRef.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createRef.spec.lua"]},{"name":"createSignal","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSignal.lua"]},{"name":"createSignal.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSignal.spec.lua"]},{"name":"createSpy","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSpy.lua"]},{"name":"createSpy.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSpy.spec.lua"]},{"name":"forwardRef","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\forwardRef.lua"]},{"name":"forwardRef.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\forwardRef.spec.lua"]},{"name":"getDefaultInstanceProperty","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\getDefaultInstanceProperty.lua"]},{"name":"getDefaultInstanceProperty.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\getDefaultInstanceProperty.spec.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\init.spec.lua"]},{"name":"internalAssert","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\internalAssert.lua"]},{"name":"invalidSetStateMessages","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\invalidSetStateMessages.lua"]},{"name":"oneChild","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\oneChild.lua"]},{"name":"oneChild.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\oneChild.spec.lua"]},{"name":"strict","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\strict.lua"]},{"name":"strict.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\strict.spec.lua"]}]}]}]},{"name":"synthetic","className":"ModuleScript","filePaths":["src\\init.luau"],"children":[{"name":"Component","className":"Folder","children":[{"name":"Button","className":"Folder","children":[{"name":"Base","className":"ModuleScript","filePaths":["src\\Component\\Button\\Base.luau"]},{"name":"ElevatedButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\ElevatedButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\ElevatedButton\\cfusion.story.luau"]}]},{"name":"FilledButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledButton\\cfusion.story.luau"]}]},{"name":"OutlinedButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedButton\\cfusion.story.luau"]}]},{"name":"TextButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\TextButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\TextButton\\cfusion.story.luau"]}]}]}]},{"name":"Config","className":"ModuleScript","filePaths":["src\\Config.luau"]},{"name":"DropShadow","className":"ModuleScript","filePaths":["src\\DropShadow\\init.luau"]},{"name":"Enums","className":"ModuleScript","filePaths":["src\\Enums.luau"]},{"name":"Sounds","className":"ModuleScript","filePaths":["src\\Sounds.luau"]},{"name":"Test","className":"Folder","children":[{"name":"Source.cfusion","className":"ModuleScript","filePaths":["src\\Test\\Source.cfusion.luau"]}]},{"name":"Types","className":"ModuleScript","filePaths":["src\\Types.luau"]},{"name":"Util","className":"ModuleScript","filePaths":["src\\Util.luau"]}]}]}]}]} \ No newline at end of file +{"name":"synthetic-test","className":"DataModel","filePaths":["dev.project.json"],"children":[{"name":"ReplicatedStorage","className":"ReplicatedStorage","children":[{"name":"Packages","className":"Folder","children":[{"name":"ColdFusion","className":"ModuleScript","filePaths":["Packages\\ColdFusion.lua"]},{"name":"CurveUtil","className":"ModuleScript","filePaths":["Packages\\CurveUtil.lua"]},{"name":"Format","className":"ModuleScript","filePaths":["Packages\\Format.lua"]},{"name":"Fusion","className":"ModuleScript","filePaths":["Packages\\Fusion.lua"]},{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\Maid.lua"]},{"name":"MaterialIcons","className":"ModuleScript","filePaths":["Packages\\MaterialIcons.lua"]},{"name":"MeshUtil","className":"ModuleScript","filePaths":["Packages\\MeshUtil.lua"]},{"name":"Roact","className":"ModuleScript","filePaths":["Packages\\Roact.lua"]},{"name":"Signal","className":"ModuleScript","filePaths":["Packages\\Signal.lua"]},{"name":"_Index","className":"Folder","children":[{"name":"elttob_fusion@0.2.0","className":"Folder","children":[{"name":"fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\init.lua","Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\default.project.json"],"children":[{"name":"Animation","className":"Folder","children":[{"name":"Spring","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\Spring.lua"]},{"name":"SpringScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\SpringScheduler.lua"]},{"name":"Tween","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\Tween.lua"]},{"name":"TweenScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\TweenScheduler.lua"]},{"name":"getTweenRatio","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\getTweenRatio.lua"]},{"name":"lerpType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\lerpType.lua"]},{"name":"packType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\packType.lua"]},{"name":"springCoefficients","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\springCoefficients.lua"]},{"name":"unpackType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\unpackType.lua"]}]},{"name":"Colour","className":"Folder","children":[{"name":"Oklab","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Colour\\Oklab.lua"]}]},{"name":"Dependencies","className":"Folder","children":[{"name":"captureDependencies","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\captureDependencies.lua"]},{"name":"initDependency","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\initDependency.lua"]},{"name":"sharedState","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\sharedState.lua"]},{"name":"updateAll","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\updateAll.lua"]},{"name":"useDependency","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\useDependency.lua"]}]},{"name":"Instances","className":"Folder","children":[{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Children.lua"]},{"name":"Cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Cleanup.lua"]},{"name":"Hydrate","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Hydrate.lua"]},{"name":"New","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\New.lua"]},{"name":"OnChange","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\OnChange.lua"]},{"name":"OnEvent","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\OnEvent.lua"]},{"name":"Out","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Out.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Ref.lua"]},{"name":"applyInstanceProps","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\applyInstanceProps.lua"]},{"name":"defaultProps","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\defaultProps.lua"]}]},{"name":"Logging","className":"Folder","children":[{"name":"logError","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logError.lua"]},{"name":"logErrorNonFatal","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logErrorNonFatal.lua"]},{"name":"logWarn","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logWarn.lua"]},{"name":"messages","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\messages.lua"]},{"name":"parseError","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\parseError.lua"]}]},{"name":"PubTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\PubTypes.lua"]},{"name":"State","className":"Folder","children":[{"name":"Computed","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Computed.lua"]},{"name":"ForKeys","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForKeys.lua"]},{"name":"ForPairs","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForPairs.lua"]},{"name":"ForValues","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForValues.lua"]},{"name":"Observer","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Observer.lua"]},{"name":"Value","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Value.lua"]},{"name":"unwrap","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\unwrap.lua"]}]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Types.lua"]},{"name":"Utility","className":"Folder","children":[{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\None.lua"]},{"name":"cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\cleanup.lua"]},{"name":"doNothing","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\doNothing.lua"]},{"name":"isSimilar","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\isSimilar.lua"]},{"name":"needsDestruction","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\needsDestruction.lua"]},{"name":"restrictRead","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\restrictRead.lua"]},{"name":"xtypeof","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\xtypeof.lua"]}]}]}]},{"name":"nightcycle_cold-fusion@9.0.7","className":"Folder","children":[{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\Maid.lua"]},{"name":"ServiceProxy","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\ServiceProxy.lua"]},{"name":"Signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\Signal.lua"]},{"name":"TableUtil","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\TableUtil.lua"]},{"name":"cold-fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\init.luau","Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\default.project.json"],"children":[{"name":"Fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\init.lua"],"children":[{"name":"Animation","className":"Folder","children":[{"name":"Spring","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\Spring.lua"]},{"name":"SpringScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\SpringScheduler.lua"]},{"name":"Tween","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\Tween.lua"]},{"name":"TweenScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\TweenScheduler.lua"]},{"name":"getTweenRatio","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\getTweenRatio.lua"]},{"name":"lerpType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\lerpType.lua"]},{"name":"packType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\packType.lua"]},{"name":"springCoefficients","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\springCoefficients.lua"]},{"name":"unpackType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\unpackType.lua"]}]},{"name":"Colour","className":"Folder","children":[{"name":"Oklab","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Colour\\Oklab.lua"]}]},{"name":"Instances","className":"Folder","children":[{"name":"Attribute","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Attribute.lua"]},{"name":"AttributeChange","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\AttributeChange.lua"]},{"name":"AttributeOut","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\AttributeOut.lua"]},{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Children.lua"]},{"name":"Cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Cleanup.lua"]},{"name":"Hydrate","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Hydrate.lua"]},{"name":"New","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\New.lua"]},{"name":"OnChange","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\OnChange.lua"]},{"name":"OnEvent","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\OnEvent.lua"]},{"name":"Out","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Out.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Ref.lua"]},{"name":"applyInstanceProps","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\applyInstanceProps.lua"]},{"name":"defaultProps","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\defaultProps.lua"]}]},{"name":"Logging","className":"Folder","children":[{"name":"logError","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logError.lua"]},{"name":"logErrorNonFatal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logErrorNonFatal.lua"]},{"name":"logWarn","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logWarn.lua"]},{"name":"messages","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\messages.lua"]},{"name":"parseError","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\parseError.lua"]}]},{"name":"PubTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\PubTypes.lua"]},{"name":"State","className":"Folder","children":[{"name":"Computed","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Computed.lua"]},{"name":"ForKeys","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForKeys.lua"]},{"name":"ForPairs","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForPairs.lua"]},{"name":"ForValues","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForValues.lua"]},{"name":"Observer","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Observer.lua"]},{"name":"Value","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Value.lua"]},{"name":"isState","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\isState.lua"]},{"name":"makeUseCallback","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\makeUseCallback.lua"]},{"name":"peek","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\peek.lua"]},{"name":"updateAll","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\updateAll.lua"]}]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Types.lua"]},{"name":"Utility","className":"Folder","children":[{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\None.lua"]},{"name":"cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\cleanup.lua"]},{"name":"doNothing","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\doNothing.lua"]},{"name":"isSimilar","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\isSimilar.lua"]},{"name":"needsDestruction","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\needsDestruction.lua"]},{"name":"restrictRead","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\restrictRead.lua"]},{"name":"xtypeof","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\xtypeof.lua"]}]}]},{"name":"InstanceTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\InstanceTypes.luau"]},{"name":"Interface","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Interface.luau"]},{"name":"Test.story","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Test.story.luau"]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Types.luau"]},{"name":"Util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Util.luau"]}]}]},{"name":"nightcycle_curve-util@1.0.0","className":"Folder","children":[{"name":"Vector","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\Vector.lua"]},{"name":"curve-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\init.lua","Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\default.project.json"],"children":[{"name":"Ease","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\Ease.lua"]},{"name":"Lerp","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\Lerp.lua"]}]}]},{"name":"nightcycle_format@0.1.3","className":"Folder","children":[{"name":"format","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\init.lua","Packages\\_Index\\nightcycle_format@0.1.3\\format\\default.project.json"],"children":[{"name":"Emoji","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\Emoji.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\init.spec.lua"]}]},{"name":"maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\maid.lua"]},{"name":"signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\signal.lua"]},{"name":"string","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\string.lua"]}]},{"name":"nightcycle_geometry-util@1.1.1","className":"Folder","children":[{"name":"geometry-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\init.lua","Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\default.project.json"],"children":[{"name":"Earcut","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\Earcut\\init.lua"],"children":[{"name":"ZeroArray","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\Earcut\\ZeroArray.lua"]}]}]}]},{"name":"nightcycle_maid@1.1.4","className":"Folder","children":[{"name":"maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\init.lua","Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\default.project.json"],"children":[{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\Maid.lua"]},{"name":"MaidTaskUtils","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\MaidTaskUtils.lua"]}]}]},{"name":"nightcycle_material-icons@1.0.1","className":"Folder","children":[{"name":"material-icons","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\init.luau","Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\default.project.json"],"children":[{"name":"Default_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_1.luau"]},{"name":"Default_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_2.luau"]},{"name":"Default_18_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_3.luau"]},{"name":"Default_18_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_4.luau"]},{"name":"Default_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_1.luau"]},{"name":"Default_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_2.luau"]},{"name":"Default_24_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_3.luau"]},{"name":"Default_24_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_4.luau"]},{"name":"Default_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_1.luau"]},{"name":"Default_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_2.luau"]},{"name":"Default_36_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_3.luau"]},{"name":"Default_36_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_4.luau"]},{"name":"Default_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_1.luau"]},{"name":"Default_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_2.luau"]},{"name":"Default_48_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_3.luau"]},{"name":"Default_48_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_4.luau"]},{"name":"Outlined_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_18_1.luau"]},{"name":"Outlined_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_18_2.luau"]},{"name":"Outlined_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_24_1.luau"]},{"name":"Outlined_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_24_2.luau"]},{"name":"Outlined_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_36_1.luau"]},{"name":"Outlined_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_36_2.luau"]},{"name":"Outlined_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_48_1.luau"]},{"name":"Outlined_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_48_2.luau"]},{"name":"Round_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_18_1.luau"]},{"name":"Round_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_18_2.luau"]},{"name":"Round_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_24_1.luau"]},{"name":"Round_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_24_2.luau"]},{"name":"Round_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_36_1.luau"]},{"name":"Round_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_36_2.luau"]},{"name":"Round_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_48_1.luau"]},{"name":"Round_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_48_2.luau"]},{"name":"Sharp_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_18_1.luau"]},{"name":"Sharp_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_18_2.luau"]},{"name":"Sharp_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_24_1.luau"]},{"name":"Sharp_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_24_2.luau"]},{"name":"Sharp_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_36_1.luau"]},{"name":"Sharp_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_36_2.luau"]},{"name":"Sharp_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_48_1.luau"]},{"name":"Sharp_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_48_2.luau"]},{"name":"TwoTone_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_18_1.luau"]},{"name":"TwoTone_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_18_2.luau"]},{"name":"TwoTone_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_24_1.luau"]},{"name":"TwoTone_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_24_2.luau"]},{"name":"TwoTone_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_36_1.luau"]},{"name":"TwoTone_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_36_2.luau"]},{"name":"TwoTone_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_48_1.luau"]},{"name":"TwoTone_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_48_2.luau"]}]}]},{"name":"nightcycle_mesh-util@1.0.3","className":"Folder","children":[{"name":"GeometryUtil","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\GeometryUtil.lua"]},{"name":"mesh-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\init.lua","Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\default.project.json"],"children":[{"name":"CornerWedgePart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\CornerWedgePart.lua"]},{"name":"Part","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\Part.lua"]},{"name":"TetraPart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\TetraPart.lua"]},{"name":"WedgePart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\WedgePart.lua"]}]}]},{"name":"nightcycle_service-proxy@1.0.0","className":"Folder","children":[{"name":"service-proxy","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_service-proxy@1.0.0\\service-proxy\\src\\init.lua","Packages\\_Index\\nightcycle_service-proxy@1.0.0\\service-proxy\\default.project.json"]}]},{"name":"nightcycle_signal@1.0.2","className":"Folder","children":[{"name":"signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_signal@1.0.2\\signal\\src\\init.lua","Packages\\_Index\\nightcycle_signal@1.0.2\\signal\\default.project.json"]}]},{"name":"nightcycle_string@0.1.0","className":"Folder","children":[{"name":"string","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_string@0.1.0\\string\\src\\init.lua","Packages\\_Index\\nightcycle_string@0.1.0\\string\\default.project.json"],"children":[{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_string@0.1.0\\string\\src\\init.spec.lua"]}]}]},{"name":"nightcycle_table-util@1.1.0","className":"Folder","children":[{"name":"table-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_table-util@1.1.0\\table-util\\src\\init.lua","Packages\\_Index\\nightcycle_table-util@1.1.0\\table-util\\default.project.json"]}]},{"name":"nightcycle_vector@1.0.2","className":"Folder","children":[{"name":"vector","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_vector@1.0.2\\vector\\src\\init.lua","Packages\\_Index\\nightcycle_vector@1.0.2\\vector\\default.project.json"]}]},{"name":"roblox_roact@1.4.4","className":"Folder","children":[{"name":"roact","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\init.lua","Packages\\_Index\\roblox_roact@1.4.4\\roact\\default.project.json"],"children":[{"name":"Binding","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Binding.lua"]},{"name":"Binding.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Binding.spec.lua"]},{"name":"Component","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.lua"]},{"name":"Component.spec","className":"Folder","children":[{"name":"context.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\context.spec.lua"]},{"name":"defaultProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\defaultProps.spec.lua"]},{"name":"didMount.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\didMount.spec.lua"]},{"name":"didUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\didUpdate.spec.lua"]},{"name":"extend.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\extend.spec.lua"]},{"name":"getDerivedStateFromProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\getDerivedStateFromProps.spec.lua"]},{"name":"getElementTraceback.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\getElementTraceback.spec.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\init.spec.lua"]},{"name":"legacyContext.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\legacyContext.spec.lua"]},{"name":"render.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\render.spec.lua"]},{"name":"setState.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\setState.spec.lua"]},{"name":"shouldUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\shouldUpdate.spec.lua"]},{"name":"validateProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\validateProps.spec.lua"]},{"name":"willUnmount.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\willUnmount.spec.lua"]},{"name":"willUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\willUpdate.spec.lua"]}]},{"name":"ComponentLifecyclePhase","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ComponentLifecyclePhase.lua"]},{"name":"Config","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Config.lua"]},{"name":"Config.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Config.spec.lua"]},{"name":"ElementKind","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementKind.lua"]},{"name":"ElementKind.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementKind.spec.lua"]},{"name":"ElementUtils","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementUtils.lua"]},{"name":"ElementUtils.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementUtils.spec.lua"]},{"name":"GlobalConfig","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\GlobalConfig.lua"]},{"name":"GlobalConfig.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\GlobalConfig.spec.lua"]},{"name":"Logging","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Logging.lua"]},{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\None.lua"]},{"name":"NoopRenderer","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\NoopRenderer.lua"]},{"name":"Portal","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Portal.lua"]},{"name":"PropMarkers","className":"Folder","children":[{"name":"Change","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Change.lua"]},{"name":"Change.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Change.spec.lua"]},{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Children.lua"]},{"name":"Event","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Event.lua"]},{"name":"Event.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Event.spec.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Ref.lua"]}]},{"name":"PureComponent","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PureComponent.lua"]},{"name":"PureComponent.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PureComponent.spec.lua"]},{"name":"RobloxRenderer","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\RobloxRenderer.lua"]},{"name":"RobloxRenderer.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\RobloxRenderer.spec.lua"]},{"name":"SingleEventManager","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\SingleEventManager.lua"]},{"name":"SingleEventManager.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\SingleEventManager.spec.lua"]},{"name":"Symbol","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Symbol.lua"]},{"name":"Symbol.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Symbol.spec.lua"]},{"name":"Type","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Type.lua"]},{"name":"Type.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Type.spec.lua"]},{"name":"assertDeepEqual","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assertDeepEqual.lua"]},{"name":"assertDeepEqual.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assertDeepEqual.spec.lua"]},{"name":"assign","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assign.lua"]},{"name":"assign.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assign.spec.lua"]},{"name":"createContext","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createContext.lua"]},{"name":"createContext.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createContext.spec.lua"]},{"name":"createElement","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createElement.lua"]},{"name":"createElement.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createElement.spec.lua"]},{"name":"createFragment","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createFragment.lua"]},{"name":"createFragment.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createFragment.spec.lua"]},{"name":"createReconciler","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconciler.lua"]},{"name":"createReconciler.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconciler.spec.lua"]},{"name":"createReconcilerCompat","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconcilerCompat.lua"]},{"name":"createReconcilerCompat.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconcilerCompat.spec.lua"]},{"name":"createRef","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createRef.lua"]},{"name":"createRef.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createRef.spec.lua"]},{"name":"createSignal","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSignal.lua"]},{"name":"createSignal.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSignal.spec.lua"]},{"name":"createSpy","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSpy.lua"]},{"name":"createSpy.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSpy.spec.lua"]},{"name":"forwardRef","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\forwardRef.lua"]},{"name":"forwardRef.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\forwardRef.spec.lua"]},{"name":"getDefaultInstanceProperty","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\getDefaultInstanceProperty.lua"]},{"name":"getDefaultInstanceProperty.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\getDefaultInstanceProperty.spec.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\init.spec.lua"]},{"name":"internalAssert","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\internalAssert.lua"]},{"name":"invalidSetStateMessages","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\invalidSetStateMessages.lua"]},{"name":"oneChild","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\oneChild.lua"]},{"name":"oneChild.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\oneChild.spec.lua"]},{"name":"strict","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\strict.lua"]},{"name":"strict.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\strict.spec.lua"]}]}]}]},{"name":"synthetic","className":"ModuleScript","filePaths":["src\\init.luau"],"children":[{"name":"Component","className":"Folder","children":[{"name":"Button","className":"Folder","children":[{"name":"Base","className":"ModuleScript","filePaths":["src\\Component\\Button\\Base.luau"]},{"name":"ElevatedButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\ElevatedButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\ElevatedButton\\cfusion.story.luau"]}]},{"name":"ExtendedFAB","className":"ModuleScript","filePaths":["src\\Component\\Button\\ExtendedFAB\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\ExtendedFAB\\cfusion.story.luau"]}]},{"name":"FAB","className":"ModuleScript","filePaths":["src\\Component\\Button\\FAB\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\FAB\\cfusion.story.luau"]}]},{"name":"FilledButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledButton\\cfusion.story.luau"]}]},{"name":"OutlinedButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedButton\\cfusion.story.luau"]}]},{"name":"TextButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\TextButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\TextButton\\cfusion.story.luau"]}]}]}]},{"name":"Config","className":"ModuleScript","filePaths":["src\\Config.luau"]},{"name":"Enums","className":"ModuleScript","filePaths":["src\\Enums.luau"]},{"name":"Sounds","className":"ModuleScript","filePaths":["src\\Sounds.luau"]},{"name":"Test","className":"Folder","children":[{"name":"Source.cfusion","className":"ModuleScript","filePaths":["src\\Test\\Source.cfusion.luau"]}]},{"name":"Types","className":"ModuleScript","filePaths":["src\\Types.luau"]},{"name":"Util","className":"ModuleScript","filePaths":["src\\Util.luau"]}]}]}]}]} \ No newline at end of file diff --git a/src/Component/Button/Base.luau b/src/Component/Button/Base.luau index 8c49278d..9debd878 100644 --- a/src/Component/Button/Base.luau +++ b/src/Component/Button/Base.luau @@ -43,7 +43,9 @@ return function ( isEnabled: CanBeState, isDropShadow: CanBeState, scale: CanBeState, - sound: CanBeState + sound: CanBeState, + hasMinimumSize: CanBeState?, + cornerRadius: CanBeState? ): ImageLabel local _fuse = ColdFusion.fuse(maid) @@ -93,6 +95,8 @@ return function ( local iconState = _import(textIcon, nil :: ImageData?) :: any local soundState = _import(sound, nil :: Sound?) local isDropShadowState = _import(isDropShadow, false) + local hasMinState = _import(hasMinimumSize, true) + local cornerRadiusState = _import(cornerRadius, SHAPE_DP) local inst: ImageLabel = _new("ImageLabel")({ Image = "rbxassetid://15549395120", @@ -164,9 +168,9 @@ return function ( }, Children = { _new("UICorner")({ - CornerRadius = _Computed(function(s: number): UDim - return UDim.new(0, s * SHAPE_DP) - end, scaleState), + CornerRadius = _Computed(function(s: number, cornerRad: number): UDim + return UDim.new(0, s * cornerRad) + end, scaleState, cornerRadiusState), }), _new("UIStroke")({ ApplyStrokeMode = Enum.ApplyStrokeMode.Border, @@ -193,6 +197,9 @@ return function ( }), _new("TextLabel")({ Text = textState, + Visible = _Computed(function(txt: string): boolean + return txt:len() > 0 + end, textState), TextScaled = true, TextXAlignment = LABEL_TEXT_ALIGNMENT, TextYAlignment = Enum.TextYAlignment.Center, @@ -237,20 +244,20 @@ return function ( end, scaleState), }), _new("UIPadding")({ - PaddingLeft = _Computed(function(s: number, icon: ImageData?): UDim - if icon then + PaddingLeft = _Computed(function(s: number, icon: ImageData?, txt: string): UDim + if icon and txt:len() > 0 then return UDim.new(0, LEFT_PADDING_WITH_ICON_DP * s) else return UDim.new(0, LEFT_RIGHT_PADDING_DP * s) end - end, scaleState, iconState), - PaddingRight = _Computed(function(s: number, icon: ImageData?): UDim - if icon then + end, scaleState, iconState, textState), + PaddingRight = _Computed(function(s: number, icon: ImageData?, txt: string): UDim + if icon and txt:len() > 0 then return UDim.new(0, RIGHT_PADDING_WITH_ICON_DP * s) else return UDim.new(0, LEFT_RIGHT_PADDING_DP * s) end - end, scaleState, iconState), + end, scaleState, iconState, textState), PaddingTop = _Computed(function(s: number): UDim return UDim.new(0, s * (HEIGHT_DP-ICON_SIZE_DP) / 2) end, scaleState), @@ -260,9 +267,13 @@ return function ( }), _new("UISizeConstraint")({ MaxSize = Vector2.new(math.huge, math.huge), - MinSize = _Computed(function(s: number): Vector2 - return Vector2.new(s * CONTAINER_WIDTH_MIN_DP, 0) - end, scaleState), + MinSize = _Computed(function(s: number, hasMin: boolean): Vector2 + if hasMin then + return Vector2.new(s * CONTAINER_WIDTH_MIN_DP, 0) + else + return Vector2.new(0, 0) + end + end, scaleState, hasMinState), }), }, }) :: TextButton diff --git a/src/Component/Button/ExtendedFAB/cfusion.story.luau b/src/Component/Button/ExtendedFAB/cfusion.story.luau new file mode 100644 index 00000000..d4906360 --- /dev/null +++ b/src/Component/Button/ExtendedFAB/cfusion.story.luau @@ -0,0 +1,128 @@ +--!strict +local _Package = script.Parent.Parent.Parent.Parent +local _Packages = _Package.Parent +-- Services +-- Packages +local Maid = require(_Packages:WaitForChild("Maid")) +local MaterialIcons = require(_Packages:WaitForChild("MaterialIcons")) + +-- Modules +local Types = require(_Package:WaitForChild("Types")) +-- Types +-- Constants +local SCALE = 1 +-- Variables +-- References +local Icons = MaterialIcons.default.dp_48.scale_1 + +-- Class +return function(frame: Frame) + local maid = Maid.new() + task.spawn(function() + local function makeHalfFrame( + isDarkMode: boolean, + color: Color3 + ): Frame + + local halfFrame = maid:GiveTask(Instance.new("Frame")) + halfFrame.BackgroundColor3 = if isDarkMode then Color3.new(0.15,0.15,0.15) else Color3.new(0.85, 0.85, 0.85) + + local listLayout = maid:GiveTask(Instance.new("UIListLayout")) + listLayout.FillDirection = Enum.FillDirection.Vertical + listLayout.Padding = UDim.new(0, 10) + listLayout.VerticalAlignment = Enum.VerticalAlignment.Center + listLayout.HorizontalAlignment = Enum.HorizontalAlignment.Center + listLayout.Parent = halfFrame + + local Module = require(script.Parent) + local theme = Types.newThemeData( + 1, + isDarkMode, + SCALE, + Font.fromEnum(Enum.Font.SourceSans), + color, + halfFrame.BackgroundColor3 + ) + + do + local button = maid:GiveTask(Module.cfusion( + function() + print("click") + end, + "Button", + theme, + nil, + nil + )) + button.Parent = halfFrame + end + + do + local button = maid:GiveTask(Module.cfusion( + function() + print("click") + end, + "Disabled", + theme, + nil, + false + )) + button.Parent = halfFrame + end + + do + local button = maid:GiveTask(Module.cfusion( + function() + print("click") + end, + "Icon", + theme, + Types.newImageData( + Icons.voice_chat.Image, + Icons.voice_chat.ImageRectOffset, + Icons.voice_chat.ImageRectSize + ), + true + )) + button.Parent = halfFrame + end + + return halfFrame + end + + local COLORS: {[number]: Color3} = { + Color3.fromHSV(0, 0.9, 0.8), + Color3.fromHSV(0, 0.25, 0.8), + Color3.fromHSV(0, 0.9, 0.5), + Color3.fromHSV(0.6, 0.9, 0.7), + Color3.fromHSV(0.35, 0.9, 0.7), + Color3.fromHSV(0.1, 0.9, 0.7), + } + + for i, color in ipairs(COLORS) do + local x = (i-1)/(#COLORS) + local width = 1/(#COLORS) + local dark = makeHalfFrame( + true, + color + ) + + dark.Size = UDim2.fromScale(width, 0.5) + dark.Position = UDim2.fromScale(x, 0.5) + dark.Parent = frame + + local bright = makeHalfFrame( + false, + color + ) + bright.Size = UDim2.fromScale(width, 0.5) + bright.Position = UDim2.fromScale(x, 0) + bright.Parent = frame + + end + + end) + return function() + maid:Destroy() + end +end \ No newline at end of file diff --git a/src/Component/Button/ExtendedFAB/init.luau b/src/Component/Button/ExtendedFAB/init.luau new file mode 100644 index 00000000..654f8b4b --- /dev/null +++ b/src/Component/Button/ExtendedFAB/init.luau @@ -0,0 +1,186 @@ +--!strict +local _Package = script.Parent.Parent.Parent +local _Packages = _Package.Parent +-- Services + +-- Packages +local Maid = require(_Packages:WaitForChild("Maid")) +local ColdFusion = require(_Packages:WaitForChild("ColdFusion")) + +-- Modules +local Sounds = require(_Package:WaitForChild("Sounds")) +local Enums = require(_Package:WaitForChild("Enums")) +local Types = require(_Package:WaitForChild("Types")) +local Config = require(_Package:WaitForChild("Config")) +local Util = require(_Package:WaitForChild("Util")) +local Base = require(script.Parent:WaitForChild("Base")) + +-- Types +type Maid = Maid.Maid +type State = ColdFusion.State +type ValueState = ColdFusion.ValueState +type CanBeState = ColdFusion.CanBeState +type TextStyle = Types.TextStyle +type ImageData = Types.ImageData +type ThemeData = Types.ThemeData +-- Constants +local DEFAULT_VOLUME = Config.Sound.Volume +local DISABLE_TRANSPARENCY = Config.Transparency.Text.Disabled +local DISABLE_BACK_TRANS = Config.Transparency.Background.Disabled +local SHAPE_DP = 20 * 0.5 +-- Variables +-- References +-- Private Functions + + +-- Class +local Interface = {} + +function Interface.cfusion( + onClick: CanBeState<() -> ()>, + text: CanBeState, + theme: CanBeState, + icon: CanBeState?, + isEnabled: CanBeState? +): ImageLabel + local maid = Maid.new() + + local _fuse = ColdFusion.fuse(maid) + + local _new = _fuse.new + local _bind = _fuse.bind + local _clone = _fuse.clone + local _import = _fuse.import + + local _Value = _fuse.Value + local _Computed = _fuse.Computed + + local onClickState = _import(onClick, function() end) + local textState = _import(text, "") + local themeState = _import(theme, Types.newThemeData( + 1, + false, + 1, + Font.fromEnum(Enum.Font.SourceSansSemibold), + Color3.fromHSV(0.8, 0.4, 0.8) + )) + + local sound = maid:GiveTask(Instance.new("Sound")) + sound.Volume = DEFAULT_VOLUME + sound.SoundId = Sounds.ui_tap_variant_01 + + local styles = _Computed(function(thm: ThemeData): {[Enums.ButtonStateType]: TextStyle} + local backColor: Color3? + local textColor: Color3? + + if thm.IsDarkMode then + backColor = Util.getReadableColor( + thm.Color3, + if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.DARK_SURFACE + ) + assert(backColor) + + textColor = Util.DARK_SURFACE + else + backColor = Util.getReadableColor( + thm.Color3, + if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.LIGHT_SURFACE + ) + assert(backColor) + + textColor = Util.LIGHT_SURFACE + end + assert(backColor) + assert(textColor) + + backColor = Util.getElevatedColor( + backColor, + thm.Elevation, + thm.IsDarkMode + ) + + textColor = Util.getElevatedColor( + textColor, + thm.Elevation, + thm.IsDarkMode + ) + + local disableBackColor = (function(): Color3 + local h,s,v = backColor:ToHSV() + return Color3.fromHSV(h,s*0,v) + end)() + + local data = { + [Enums.ButtonStateType.Enabled] = Types.newTextStyle( + textColor, + 0, + backColor, + 0, + textColor, + 1 + ), + [Enums.ButtonStateType.Disabled] = Types.newTextStyle( + (function(): Color3 + if thm.IsDarkMode then + return Util.LIGHT_SURFACE + else + return Util.DARK_SURFACE + end + end)(), + DISABLE_TRANSPARENCY, + disableBackColor, + DISABLE_BACK_TRANS, + textColor, + 1 + ), + [Enums.ButtonStateType.Focused] = Types.newTextStyle( + textColor, + 0, + backColor, + 0, + textColor, + 1 + ), + [Enums.ButtonStateType.Hovered] = Types.newTextStyle( + textColor, + 0, + backColor, + 0, + textColor, + 1 + ), + [Enums.ButtonStateType.Pressed] = Types.newTextStyle( + textColor, + 0, + backColor, + 0, + textColor, + 1 + ), + } + return data + end, themeState) + + local button = Base( + maid, + onClickState, + textState, + _Computed(function(t: ThemeData): Font + return t.Font + end, themeState), + styles, + icon, + if isEnabled == nil then true else isEnabled, + false, + _Computed(function(t: ThemeData): number + return t.Scale + end, themeState), + sound, + false, + SHAPE_DP + ) + maid.bind(button) + return button +end + +return Interface \ No newline at end of file diff --git a/src/Component/Button/FAB/cfusion.story.luau b/src/Component/Button/FAB/cfusion.story.luau new file mode 100644 index 00000000..20e27d58 --- /dev/null +++ b/src/Component/Button/FAB/cfusion.story.luau @@ -0,0 +1,127 @@ +--!strict +local _Package = script.Parent.Parent.Parent.Parent +local _Packages = _Package.Parent +-- Services +-- Packages +local Maid = require(_Packages:WaitForChild("Maid")) +local MaterialIcons = require(_Packages:WaitForChild("MaterialIcons")) + +-- Modules +local Types = require(_Package:WaitForChild("Types")) +-- Types +-- Constants +local SCALE = 1 +-- Variables +-- References +local Icons = MaterialIcons.default.dp_48.scale_1 + +-- Class +return function(frame: Frame) + local maid = Maid.new() + task.spawn(function() + local function makeHalfFrame( + isDarkMode: boolean, + color: Color3 + ): Frame + + local halfFrame = maid:GiveTask(Instance.new("Frame")) + halfFrame.BackgroundColor3 = if isDarkMode then Color3.new(0.15,0.15,0.15) else Color3.new(0.85, 0.85, 0.85) + + local listLayout = maid:GiveTask(Instance.new("UIListLayout")) + listLayout.FillDirection = Enum.FillDirection.Vertical + listLayout.Padding = UDim.new(0, 10) + listLayout.VerticalAlignment = Enum.VerticalAlignment.Center + listLayout.HorizontalAlignment = Enum.HorizontalAlignment.Center + listLayout.Parent = halfFrame + + local img = Types.newImageData( + Icons.voice_chat.Image, + Icons.voice_chat.ImageRectOffset, + Icons.voice_chat.ImageRectSize + ) + + local Module = require(script.Parent) + local theme = Types.newThemeData( + 1, + isDarkMode, + SCALE, + Font.fromEnum(Enum.Font.SourceSans), + color, + halfFrame.BackgroundColor3 + ) + + do + local button = maid:GiveTask(Module.cfusion( + function() + print("click") + end, + img, + theme, + nil + )) + button.Parent = halfFrame + end + + do + local button = maid:GiveTask(Module.cfusion( + function() + print("click") + end, + img, + theme, + false + )) + button.Parent = halfFrame + end + + do + local button = maid:GiveTask(Module.cfusion( + function() + print("click") + end, + img, + theme, + true + )) + button.Parent = halfFrame + end + + return halfFrame + end + + local COLORS: {[number]: Color3} = { + Color3.fromHSV(0, 0.9, 0.8), + Color3.fromHSV(0, 0.25, 0.8), + Color3.fromHSV(0, 0.9, 0.5), + Color3.fromHSV(0.6, 0.9, 0.7), + Color3.fromHSV(0.35, 0.9, 0.7), + Color3.fromHSV(0.1, 0.9, 0.7), + } + + for i, color in ipairs(COLORS) do + local x = (i-1)/(#COLORS) + local width = 1/(#COLORS) + local dark = makeHalfFrame( + true, + color + ) + + dark.Size = UDim2.fromScale(width, 0.5) + dark.Position = UDim2.fromScale(x, 0.5) + dark.Parent = frame + + local bright = makeHalfFrame( + false, + color + ) + bright.Size = UDim2.fromScale(width, 0.5) + bright.Position = UDim2.fromScale(x, 0) + bright.Parent = frame + + end + + end) + return function() + maid:Destroy() + end +end \ No newline at end of file diff --git a/src/Component/Button/FAB/init.luau b/src/Component/Button/FAB/init.luau new file mode 100644 index 00000000..a378f6f5 --- /dev/null +++ b/src/Component/Button/FAB/init.luau @@ -0,0 +1,184 @@ +--!strict +local _Package = script.Parent.Parent.Parent +local _Packages = _Package.Parent +-- Services + +-- Packages +local Maid = require(_Packages:WaitForChild("Maid")) +local ColdFusion = require(_Packages:WaitForChild("ColdFusion")) + +-- Modules +local Sounds = require(_Package:WaitForChild("Sounds")) +local Enums = require(_Package:WaitForChild("Enums")) +local Types = require(_Package:WaitForChild("Types")) +local Config = require(_Package:WaitForChild("Config")) +local Util = require(_Package:WaitForChild("Util")) +local Base = require(script.Parent:WaitForChild("Base")) + +-- Types +type Maid = Maid.Maid +type State = ColdFusion.State +type ValueState = ColdFusion.ValueState +type CanBeState = ColdFusion.CanBeState +type TextStyle = Types.TextStyle +type ImageData = Types.ImageData +type ThemeData = Types.ThemeData +-- Constants +local DEFAULT_VOLUME = Config.Sound.Volume +local DISABLE_TRANSPARENCY = Config.Transparency.Text.Disabled +local DISABLE_BACK_TRANS = Config.Transparency.Background.Disabled +local SHAPE_DP = 20*0.5 +-- Variables +-- References +-- Private Functions + + +-- Class +local Interface = {} + +function Interface.cfusion( + onClick: CanBeState<() -> ()>, + icon: CanBeState, + theme: CanBeState, + isEnabled: CanBeState? +): ImageLabel + local maid = Maid.new() + + local _fuse = ColdFusion.fuse(maid) + + local _new = _fuse.new + local _bind = _fuse.bind + local _clone = _fuse.clone + local _import = _fuse.import + + local _Value = _fuse.Value + local _Computed = _fuse.Computed + + local onClickState = _import(onClick, function() end) + local themeState = _import(theme, Types.newThemeData( + 1, + false, + 1, + Font.fromEnum(Enum.Font.SourceSansSemibold), + Color3.fromHSV(0.8, 0.4, 0.8) + )) + + local sound = maid:GiveTask(Instance.new("Sound")) + sound.Volume = DEFAULT_VOLUME + sound.SoundId = Sounds.ui_tap_variant_01 + + local styles = _Computed(function(thm: ThemeData): {[Enums.ButtonStateType]: TextStyle} + local backColor: Color3? + local textColor: Color3? + + if thm.IsDarkMode then + backColor = Util.getReadableColor( + thm.Color3, + if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.DARK_SURFACE + ) + assert(backColor) + + textColor = Util.DARK_SURFACE + else + backColor = Util.getReadableColor( + thm.Color3, + if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.LIGHT_SURFACE + ) + assert(backColor) + + textColor = Util.LIGHT_SURFACE + end + assert(backColor) + assert(textColor) + + backColor = Util.getElevatedColor( + backColor, + thm.Elevation, + thm.IsDarkMode + ) + + textColor = Util.getElevatedColor( + textColor, + thm.Elevation, + thm.IsDarkMode + ) + + local disableBackColor = (function(): Color3 + local h,s,v = backColor:ToHSV() + return Color3.fromHSV(h,s*0,v) + end)() + + local data = { + [Enums.ButtonStateType.Enabled] = Types.newTextStyle( + textColor, + 0, + backColor, + 0, + textColor, + 1 + ), + [Enums.ButtonStateType.Disabled] = Types.newTextStyle( + (function(): Color3 + if thm.IsDarkMode then + return Util.LIGHT_SURFACE + else + return Util.DARK_SURFACE + end + end)(), + DISABLE_TRANSPARENCY, + disableBackColor, + DISABLE_BACK_TRANS, + textColor, + 1 + ), + [Enums.ButtonStateType.Focused] = Types.newTextStyle( + textColor, + 0, + backColor, + 0, + textColor, + 1 + ), + [Enums.ButtonStateType.Hovered] = Types.newTextStyle( + textColor, + 0, + backColor, + 0, + textColor, + 1 + ), + [Enums.ButtonStateType.Pressed] = Types.newTextStyle( + textColor, + 0, + backColor, + 0, + textColor, + 1 + ), + } + return data + end, themeState) + + local button = Base( + maid, + onClickState, + "", + _Computed(function(t: ThemeData): Font + return t.Font + end, themeState), + styles, + icon, + if isEnabled == nil then true else isEnabled, + true, + _Computed(function(t: ThemeData): number + return t.Scale * 1.25 + end, themeState), + sound, + false, + SHAPE_DP + ) + maid.bind(button) + return button +end + +return Interface \ No newline at end of file diff --git a/src/Component/Button/FilledButton/init.luau b/src/Component/Button/FilledButton/init.luau index 126fd4be..76ef2157 100644 --- a/src/Component/Button/FilledButton/init.luau +++ b/src/Component/Button/FilledButton/init.luau @@ -37,11 +37,11 @@ local DISABLE_BACK_TRANS = Config.Transparency.Background.Disabled local Interface = {} function Interface.cfusion( - onClick: CanBeState<() -> ()>, - text: CanBeState, - theme: CanBeState, - icon: CanBeState?, - isEnabled: CanBeState? + onClick: CanBeState<() -> ()>, + text: CanBeState, + theme: CanBeState, + icon: CanBeState?, + isEnabled: CanBeState? ): ImageLabel local maid = Maid.new() From 5acf64b79b75df609ecccd2cb0a0751433210772 Mon Sep 17 00:00:00 2001 From: Nightcycle <77173389+nightcycle@users.noreply.github.com> Date: Tue, 5 Dec 2023 18:38:11 -0500 Subject: [PATCH 08/57] Color tweaks --- src/Component/Button/TextButton/init.luau | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/Component/Button/TextButton/init.luau b/src/Component/Button/TextButton/init.luau index fcce9196..acc9723f 100644 --- a/src/Component/Button/TextButton/init.luau +++ b/src/Component/Button/TextButton/init.luau @@ -76,14 +76,13 @@ function Interface.cfusion( if thm.IsDarkMode then textColor = Util.getReadableColor( thm.Color3, - if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.DARK_SURFACE, - 12 + if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.DARK_SURFACE ) + else textColor = Util.getReadableColor( thm.Color3, - if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.LIGHT_SURFACE, - 5 + if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.LIGHT_SURFACE ) end assert(textColor) From eb5c6581f3841142e4336f255d1d60639d8d7b4c Mon Sep 17 00:00:00 2001 From: Nightcycle <77173389+nightcycle@users.noreply.github.com> Date: Tue, 5 Dec 2023 19:06:32 -0500 Subject: [PATCH 09/57] Added icon buttons --- sourcemap.json | 2 +- src/Component/Button/Base.luau | 48 +++-- src/Component/Button/FAB/cfusion.story.luau | 12 -- .../FilledIconButton/cfusion.story.luau | 115 +++++++++++ .../Button/FilledIconButton/init.luau | 185 ++++++++++++++++++ .../Button/IconButton/cfusion.story.luau | 115 +++++++++++ src/Component/Button/IconButton/init.luau | 173 ++++++++++++++++ .../OutlinedIconButton/cfusion.story.luau | 115 +++++++++++ .../Button/OutlinedIconButton/init.luau | 179 +++++++++++++++++ src/Component/Button/TextButton/init.luau | 1 - 10 files changed, 913 insertions(+), 32 deletions(-) create mode 100644 src/Component/Button/FilledIconButton/cfusion.story.luau create mode 100644 src/Component/Button/FilledIconButton/init.luau create mode 100644 src/Component/Button/IconButton/cfusion.story.luau create mode 100644 src/Component/Button/IconButton/init.luau create mode 100644 src/Component/Button/OutlinedIconButton/cfusion.story.luau create mode 100644 src/Component/Button/OutlinedIconButton/init.luau diff --git a/sourcemap.json b/sourcemap.json index 72873c9a..c71a7686 100644 --- a/sourcemap.json +++ b/sourcemap.json @@ -1 +1 @@ -{"name":"synthetic-test","className":"DataModel","filePaths":["dev.project.json"],"children":[{"name":"ReplicatedStorage","className":"ReplicatedStorage","children":[{"name":"Packages","className":"Folder","children":[{"name":"ColdFusion","className":"ModuleScript","filePaths":["Packages\\ColdFusion.lua"]},{"name":"CurveUtil","className":"ModuleScript","filePaths":["Packages\\CurveUtil.lua"]},{"name":"Format","className":"ModuleScript","filePaths":["Packages\\Format.lua"]},{"name":"Fusion","className":"ModuleScript","filePaths":["Packages\\Fusion.lua"]},{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\Maid.lua"]},{"name":"MaterialIcons","className":"ModuleScript","filePaths":["Packages\\MaterialIcons.lua"]},{"name":"MeshUtil","className":"ModuleScript","filePaths":["Packages\\MeshUtil.lua"]},{"name":"Roact","className":"ModuleScript","filePaths":["Packages\\Roact.lua"]},{"name":"Signal","className":"ModuleScript","filePaths":["Packages\\Signal.lua"]},{"name":"_Index","className":"Folder","children":[{"name":"elttob_fusion@0.2.0","className":"Folder","children":[{"name":"fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\init.lua","Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\default.project.json"],"children":[{"name":"Animation","className":"Folder","children":[{"name":"Spring","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\Spring.lua"]},{"name":"SpringScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\SpringScheduler.lua"]},{"name":"Tween","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\Tween.lua"]},{"name":"TweenScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\TweenScheduler.lua"]},{"name":"getTweenRatio","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\getTweenRatio.lua"]},{"name":"lerpType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\lerpType.lua"]},{"name":"packType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\packType.lua"]},{"name":"springCoefficients","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\springCoefficients.lua"]},{"name":"unpackType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\unpackType.lua"]}]},{"name":"Colour","className":"Folder","children":[{"name":"Oklab","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Colour\\Oklab.lua"]}]},{"name":"Dependencies","className":"Folder","children":[{"name":"captureDependencies","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\captureDependencies.lua"]},{"name":"initDependency","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\initDependency.lua"]},{"name":"sharedState","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\sharedState.lua"]},{"name":"updateAll","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\updateAll.lua"]},{"name":"useDependency","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\useDependency.lua"]}]},{"name":"Instances","className":"Folder","children":[{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Children.lua"]},{"name":"Cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Cleanup.lua"]},{"name":"Hydrate","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Hydrate.lua"]},{"name":"New","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\New.lua"]},{"name":"OnChange","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\OnChange.lua"]},{"name":"OnEvent","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\OnEvent.lua"]},{"name":"Out","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Out.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Ref.lua"]},{"name":"applyInstanceProps","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\applyInstanceProps.lua"]},{"name":"defaultProps","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\defaultProps.lua"]}]},{"name":"Logging","className":"Folder","children":[{"name":"logError","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logError.lua"]},{"name":"logErrorNonFatal","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logErrorNonFatal.lua"]},{"name":"logWarn","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logWarn.lua"]},{"name":"messages","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\messages.lua"]},{"name":"parseError","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\parseError.lua"]}]},{"name":"PubTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\PubTypes.lua"]},{"name":"State","className":"Folder","children":[{"name":"Computed","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Computed.lua"]},{"name":"ForKeys","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForKeys.lua"]},{"name":"ForPairs","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForPairs.lua"]},{"name":"ForValues","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForValues.lua"]},{"name":"Observer","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Observer.lua"]},{"name":"Value","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Value.lua"]},{"name":"unwrap","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\unwrap.lua"]}]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Types.lua"]},{"name":"Utility","className":"Folder","children":[{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\None.lua"]},{"name":"cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\cleanup.lua"]},{"name":"doNothing","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\doNothing.lua"]},{"name":"isSimilar","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\isSimilar.lua"]},{"name":"needsDestruction","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\needsDestruction.lua"]},{"name":"restrictRead","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\restrictRead.lua"]},{"name":"xtypeof","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\xtypeof.lua"]}]}]}]},{"name":"nightcycle_cold-fusion@9.0.7","className":"Folder","children":[{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\Maid.lua"]},{"name":"ServiceProxy","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\ServiceProxy.lua"]},{"name":"Signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\Signal.lua"]},{"name":"TableUtil","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\TableUtil.lua"]},{"name":"cold-fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\init.luau","Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\default.project.json"],"children":[{"name":"Fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\init.lua"],"children":[{"name":"Animation","className":"Folder","children":[{"name":"Spring","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\Spring.lua"]},{"name":"SpringScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\SpringScheduler.lua"]},{"name":"Tween","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\Tween.lua"]},{"name":"TweenScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\TweenScheduler.lua"]},{"name":"getTweenRatio","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\getTweenRatio.lua"]},{"name":"lerpType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\lerpType.lua"]},{"name":"packType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\packType.lua"]},{"name":"springCoefficients","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\springCoefficients.lua"]},{"name":"unpackType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\unpackType.lua"]}]},{"name":"Colour","className":"Folder","children":[{"name":"Oklab","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Colour\\Oklab.lua"]}]},{"name":"Instances","className":"Folder","children":[{"name":"Attribute","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Attribute.lua"]},{"name":"AttributeChange","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\AttributeChange.lua"]},{"name":"AttributeOut","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\AttributeOut.lua"]},{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Children.lua"]},{"name":"Cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Cleanup.lua"]},{"name":"Hydrate","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Hydrate.lua"]},{"name":"New","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\New.lua"]},{"name":"OnChange","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\OnChange.lua"]},{"name":"OnEvent","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\OnEvent.lua"]},{"name":"Out","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Out.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Ref.lua"]},{"name":"applyInstanceProps","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\applyInstanceProps.lua"]},{"name":"defaultProps","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\defaultProps.lua"]}]},{"name":"Logging","className":"Folder","children":[{"name":"logError","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logError.lua"]},{"name":"logErrorNonFatal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logErrorNonFatal.lua"]},{"name":"logWarn","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logWarn.lua"]},{"name":"messages","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\messages.lua"]},{"name":"parseError","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\parseError.lua"]}]},{"name":"PubTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\PubTypes.lua"]},{"name":"State","className":"Folder","children":[{"name":"Computed","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Computed.lua"]},{"name":"ForKeys","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForKeys.lua"]},{"name":"ForPairs","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForPairs.lua"]},{"name":"ForValues","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForValues.lua"]},{"name":"Observer","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Observer.lua"]},{"name":"Value","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Value.lua"]},{"name":"isState","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\isState.lua"]},{"name":"makeUseCallback","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\makeUseCallback.lua"]},{"name":"peek","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\peek.lua"]},{"name":"updateAll","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\updateAll.lua"]}]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Types.lua"]},{"name":"Utility","className":"Folder","children":[{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\None.lua"]},{"name":"cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\cleanup.lua"]},{"name":"doNothing","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\doNothing.lua"]},{"name":"isSimilar","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\isSimilar.lua"]},{"name":"needsDestruction","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\needsDestruction.lua"]},{"name":"restrictRead","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\restrictRead.lua"]},{"name":"xtypeof","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\xtypeof.lua"]}]}]},{"name":"InstanceTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\InstanceTypes.luau"]},{"name":"Interface","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Interface.luau"]},{"name":"Test.story","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Test.story.luau"]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Types.luau"]},{"name":"Util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Util.luau"]}]}]},{"name":"nightcycle_curve-util@1.0.0","className":"Folder","children":[{"name":"Vector","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\Vector.lua"]},{"name":"curve-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\init.lua","Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\default.project.json"],"children":[{"name":"Ease","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\Ease.lua"]},{"name":"Lerp","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\Lerp.lua"]}]}]},{"name":"nightcycle_format@0.1.3","className":"Folder","children":[{"name":"format","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\init.lua","Packages\\_Index\\nightcycle_format@0.1.3\\format\\default.project.json"],"children":[{"name":"Emoji","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\Emoji.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\init.spec.lua"]}]},{"name":"maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\maid.lua"]},{"name":"signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\signal.lua"]},{"name":"string","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\string.lua"]}]},{"name":"nightcycle_geometry-util@1.1.1","className":"Folder","children":[{"name":"geometry-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\init.lua","Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\default.project.json"],"children":[{"name":"Earcut","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\Earcut\\init.lua"],"children":[{"name":"ZeroArray","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\Earcut\\ZeroArray.lua"]}]}]}]},{"name":"nightcycle_maid@1.1.4","className":"Folder","children":[{"name":"maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\init.lua","Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\default.project.json"],"children":[{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\Maid.lua"]},{"name":"MaidTaskUtils","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\MaidTaskUtils.lua"]}]}]},{"name":"nightcycle_material-icons@1.0.1","className":"Folder","children":[{"name":"material-icons","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\init.luau","Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\default.project.json"],"children":[{"name":"Default_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_1.luau"]},{"name":"Default_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_2.luau"]},{"name":"Default_18_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_3.luau"]},{"name":"Default_18_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_4.luau"]},{"name":"Default_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_1.luau"]},{"name":"Default_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_2.luau"]},{"name":"Default_24_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_3.luau"]},{"name":"Default_24_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_4.luau"]},{"name":"Default_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_1.luau"]},{"name":"Default_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_2.luau"]},{"name":"Default_36_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_3.luau"]},{"name":"Default_36_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_4.luau"]},{"name":"Default_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_1.luau"]},{"name":"Default_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_2.luau"]},{"name":"Default_48_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_3.luau"]},{"name":"Default_48_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_4.luau"]},{"name":"Outlined_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_18_1.luau"]},{"name":"Outlined_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_18_2.luau"]},{"name":"Outlined_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_24_1.luau"]},{"name":"Outlined_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_24_2.luau"]},{"name":"Outlined_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_36_1.luau"]},{"name":"Outlined_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_36_2.luau"]},{"name":"Outlined_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_48_1.luau"]},{"name":"Outlined_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_48_2.luau"]},{"name":"Round_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_18_1.luau"]},{"name":"Round_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_18_2.luau"]},{"name":"Round_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_24_1.luau"]},{"name":"Round_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_24_2.luau"]},{"name":"Round_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_36_1.luau"]},{"name":"Round_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_36_2.luau"]},{"name":"Round_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_48_1.luau"]},{"name":"Round_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_48_2.luau"]},{"name":"Sharp_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_18_1.luau"]},{"name":"Sharp_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_18_2.luau"]},{"name":"Sharp_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_24_1.luau"]},{"name":"Sharp_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_24_2.luau"]},{"name":"Sharp_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_36_1.luau"]},{"name":"Sharp_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_36_2.luau"]},{"name":"Sharp_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_48_1.luau"]},{"name":"Sharp_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_48_2.luau"]},{"name":"TwoTone_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_18_1.luau"]},{"name":"TwoTone_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_18_2.luau"]},{"name":"TwoTone_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_24_1.luau"]},{"name":"TwoTone_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_24_2.luau"]},{"name":"TwoTone_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_36_1.luau"]},{"name":"TwoTone_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_36_2.luau"]},{"name":"TwoTone_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_48_1.luau"]},{"name":"TwoTone_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_48_2.luau"]}]}]},{"name":"nightcycle_mesh-util@1.0.3","className":"Folder","children":[{"name":"GeometryUtil","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\GeometryUtil.lua"]},{"name":"mesh-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\init.lua","Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\default.project.json"],"children":[{"name":"CornerWedgePart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\CornerWedgePart.lua"]},{"name":"Part","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\Part.lua"]},{"name":"TetraPart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\TetraPart.lua"]},{"name":"WedgePart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\WedgePart.lua"]}]}]},{"name":"nightcycle_service-proxy@1.0.0","className":"Folder","children":[{"name":"service-proxy","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_service-proxy@1.0.0\\service-proxy\\src\\init.lua","Packages\\_Index\\nightcycle_service-proxy@1.0.0\\service-proxy\\default.project.json"]}]},{"name":"nightcycle_signal@1.0.2","className":"Folder","children":[{"name":"signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_signal@1.0.2\\signal\\src\\init.lua","Packages\\_Index\\nightcycle_signal@1.0.2\\signal\\default.project.json"]}]},{"name":"nightcycle_string@0.1.0","className":"Folder","children":[{"name":"string","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_string@0.1.0\\string\\src\\init.lua","Packages\\_Index\\nightcycle_string@0.1.0\\string\\default.project.json"],"children":[{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_string@0.1.0\\string\\src\\init.spec.lua"]}]}]},{"name":"nightcycle_table-util@1.1.0","className":"Folder","children":[{"name":"table-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_table-util@1.1.0\\table-util\\src\\init.lua","Packages\\_Index\\nightcycle_table-util@1.1.0\\table-util\\default.project.json"]}]},{"name":"nightcycle_vector@1.0.2","className":"Folder","children":[{"name":"vector","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_vector@1.0.2\\vector\\src\\init.lua","Packages\\_Index\\nightcycle_vector@1.0.2\\vector\\default.project.json"]}]},{"name":"roblox_roact@1.4.4","className":"Folder","children":[{"name":"roact","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\init.lua","Packages\\_Index\\roblox_roact@1.4.4\\roact\\default.project.json"],"children":[{"name":"Binding","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Binding.lua"]},{"name":"Binding.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Binding.spec.lua"]},{"name":"Component","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.lua"]},{"name":"Component.spec","className":"Folder","children":[{"name":"context.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\context.spec.lua"]},{"name":"defaultProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\defaultProps.spec.lua"]},{"name":"didMount.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\didMount.spec.lua"]},{"name":"didUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\didUpdate.spec.lua"]},{"name":"extend.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\extend.spec.lua"]},{"name":"getDerivedStateFromProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\getDerivedStateFromProps.spec.lua"]},{"name":"getElementTraceback.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\getElementTraceback.spec.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\init.spec.lua"]},{"name":"legacyContext.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\legacyContext.spec.lua"]},{"name":"render.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\render.spec.lua"]},{"name":"setState.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\setState.spec.lua"]},{"name":"shouldUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\shouldUpdate.spec.lua"]},{"name":"validateProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\validateProps.spec.lua"]},{"name":"willUnmount.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\willUnmount.spec.lua"]},{"name":"willUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\willUpdate.spec.lua"]}]},{"name":"ComponentLifecyclePhase","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ComponentLifecyclePhase.lua"]},{"name":"Config","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Config.lua"]},{"name":"Config.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Config.spec.lua"]},{"name":"ElementKind","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementKind.lua"]},{"name":"ElementKind.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementKind.spec.lua"]},{"name":"ElementUtils","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementUtils.lua"]},{"name":"ElementUtils.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementUtils.spec.lua"]},{"name":"GlobalConfig","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\GlobalConfig.lua"]},{"name":"GlobalConfig.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\GlobalConfig.spec.lua"]},{"name":"Logging","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Logging.lua"]},{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\None.lua"]},{"name":"NoopRenderer","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\NoopRenderer.lua"]},{"name":"Portal","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Portal.lua"]},{"name":"PropMarkers","className":"Folder","children":[{"name":"Change","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Change.lua"]},{"name":"Change.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Change.spec.lua"]},{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Children.lua"]},{"name":"Event","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Event.lua"]},{"name":"Event.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Event.spec.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Ref.lua"]}]},{"name":"PureComponent","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PureComponent.lua"]},{"name":"PureComponent.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PureComponent.spec.lua"]},{"name":"RobloxRenderer","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\RobloxRenderer.lua"]},{"name":"RobloxRenderer.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\RobloxRenderer.spec.lua"]},{"name":"SingleEventManager","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\SingleEventManager.lua"]},{"name":"SingleEventManager.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\SingleEventManager.spec.lua"]},{"name":"Symbol","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Symbol.lua"]},{"name":"Symbol.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Symbol.spec.lua"]},{"name":"Type","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Type.lua"]},{"name":"Type.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Type.spec.lua"]},{"name":"assertDeepEqual","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assertDeepEqual.lua"]},{"name":"assertDeepEqual.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assertDeepEqual.spec.lua"]},{"name":"assign","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assign.lua"]},{"name":"assign.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assign.spec.lua"]},{"name":"createContext","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createContext.lua"]},{"name":"createContext.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createContext.spec.lua"]},{"name":"createElement","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createElement.lua"]},{"name":"createElement.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createElement.spec.lua"]},{"name":"createFragment","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createFragment.lua"]},{"name":"createFragment.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createFragment.spec.lua"]},{"name":"createReconciler","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconciler.lua"]},{"name":"createReconciler.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconciler.spec.lua"]},{"name":"createReconcilerCompat","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconcilerCompat.lua"]},{"name":"createReconcilerCompat.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconcilerCompat.spec.lua"]},{"name":"createRef","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createRef.lua"]},{"name":"createRef.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createRef.spec.lua"]},{"name":"createSignal","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSignal.lua"]},{"name":"createSignal.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSignal.spec.lua"]},{"name":"createSpy","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSpy.lua"]},{"name":"createSpy.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSpy.spec.lua"]},{"name":"forwardRef","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\forwardRef.lua"]},{"name":"forwardRef.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\forwardRef.spec.lua"]},{"name":"getDefaultInstanceProperty","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\getDefaultInstanceProperty.lua"]},{"name":"getDefaultInstanceProperty.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\getDefaultInstanceProperty.spec.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\init.spec.lua"]},{"name":"internalAssert","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\internalAssert.lua"]},{"name":"invalidSetStateMessages","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\invalidSetStateMessages.lua"]},{"name":"oneChild","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\oneChild.lua"]},{"name":"oneChild.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\oneChild.spec.lua"]},{"name":"strict","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\strict.lua"]},{"name":"strict.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\strict.spec.lua"]}]}]}]},{"name":"synthetic","className":"ModuleScript","filePaths":["src\\init.luau"],"children":[{"name":"Component","className":"Folder","children":[{"name":"Button","className":"Folder","children":[{"name":"Base","className":"ModuleScript","filePaths":["src\\Component\\Button\\Base.luau"]},{"name":"ElevatedButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\ElevatedButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\ElevatedButton\\cfusion.story.luau"]}]},{"name":"ExtendedFAB","className":"ModuleScript","filePaths":["src\\Component\\Button\\ExtendedFAB\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\ExtendedFAB\\cfusion.story.luau"]}]},{"name":"FAB","className":"ModuleScript","filePaths":["src\\Component\\Button\\FAB\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\FAB\\cfusion.story.luau"]}]},{"name":"FilledButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledButton\\cfusion.story.luau"]}]},{"name":"OutlinedButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedButton\\cfusion.story.luau"]}]},{"name":"TextButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\TextButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\TextButton\\cfusion.story.luau"]}]}]}]},{"name":"Config","className":"ModuleScript","filePaths":["src\\Config.luau"]},{"name":"Enums","className":"ModuleScript","filePaths":["src\\Enums.luau"]},{"name":"Sounds","className":"ModuleScript","filePaths":["src\\Sounds.luau"]},{"name":"Test","className":"Folder","children":[{"name":"Source.cfusion","className":"ModuleScript","filePaths":["src\\Test\\Source.cfusion.luau"]}]},{"name":"Types","className":"ModuleScript","filePaths":["src\\Types.luau"]},{"name":"Util","className":"ModuleScript","filePaths":["src\\Util.luau"]}]}]}]}]} \ No newline at end of file +{"name":"synthetic-test","className":"DataModel","filePaths":["dev.project.json"],"children":[{"name":"ReplicatedStorage","className":"ReplicatedStorage","children":[{"name":"Packages","className":"Folder","children":[{"name":"ColdFusion","className":"ModuleScript","filePaths":["Packages\\ColdFusion.lua"]},{"name":"CurveUtil","className":"ModuleScript","filePaths":["Packages\\CurveUtil.lua"]},{"name":"Format","className":"ModuleScript","filePaths":["Packages\\Format.lua"]},{"name":"Fusion","className":"ModuleScript","filePaths":["Packages\\Fusion.lua"]},{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\Maid.lua"]},{"name":"MaterialIcons","className":"ModuleScript","filePaths":["Packages\\MaterialIcons.lua"]},{"name":"MeshUtil","className":"ModuleScript","filePaths":["Packages\\MeshUtil.lua"]},{"name":"Roact","className":"ModuleScript","filePaths":["Packages\\Roact.lua"]},{"name":"Signal","className":"ModuleScript","filePaths":["Packages\\Signal.lua"]},{"name":"_Index","className":"Folder","children":[{"name":"elttob_fusion@0.2.0","className":"Folder","children":[{"name":"fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\init.lua","Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\default.project.json"],"children":[{"name":"Animation","className":"Folder","children":[{"name":"Spring","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\Spring.lua"]},{"name":"SpringScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\SpringScheduler.lua"]},{"name":"Tween","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\Tween.lua"]},{"name":"TweenScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\TweenScheduler.lua"]},{"name":"getTweenRatio","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\getTweenRatio.lua"]},{"name":"lerpType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\lerpType.lua"]},{"name":"packType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\packType.lua"]},{"name":"springCoefficients","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\springCoefficients.lua"]},{"name":"unpackType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\unpackType.lua"]}]},{"name":"Colour","className":"Folder","children":[{"name":"Oklab","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Colour\\Oklab.lua"]}]},{"name":"Dependencies","className":"Folder","children":[{"name":"captureDependencies","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\captureDependencies.lua"]},{"name":"initDependency","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\initDependency.lua"]},{"name":"sharedState","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\sharedState.lua"]},{"name":"updateAll","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\updateAll.lua"]},{"name":"useDependency","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\useDependency.lua"]}]},{"name":"Instances","className":"Folder","children":[{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Children.lua"]},{"name":"Cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Cleanup.lua"]},{"name":"Hydrate","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Hydrate.lua"]},{"name":"New","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\New.lua"]},{"name":"OnChange","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\OnChange.lua"]},{"name":"OnEvent","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\OnEvent.lua"]},{"name":"Out","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Out.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Ref.lua"]},{"name":"applyInstanceProps","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\applyInstanceProps.lua"]},{"name":"defaultProps","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\defaultProps.lua"]}]},{"name":"Logging","className":"Folder","children":[{"name":"logError","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logError.lua"]},{"name":"logErrorNonFatal","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logErrorNonFatal.lua"]},{"name":"logWarn","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logWarn.lua"]},{"name":"messages","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\messages.lua"]},{"name":"parseError","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\parseError.lua"]}]},{"name":"PubTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\PubTypes.lua"]},{"name":"State","className":"Folder","children":[{"name":"Computed","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Computed.lua"]},{"name":"ForKeys","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForKeys.lua"]},{"name":"ForPairs","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForPairs.lua"]},{"name":"ForValues","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForValues.lua"]},{"name":"Observer","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Observer.lua"]},{"name":"Value","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Value.lua"]},{"name":"unwrap","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\unwrap.lua"]}]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Types.lua"]},{"name":"Utility","className":"Folder","children":[{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\None.lua"]},{"name":"cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\cleanup.lua"]},{"name":"doNothing","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\doNothing.lua"]},{"name":"isSimilar","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\isSimilar.lua"]},{"name":"needsDestruction","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\needsDestruction.lua"]},{"name":"restrictRead","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\restrictRead.lua"]},{"name":"xtypeof","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\xtypeof.lua"]}]}]}]},{"name":"nightcycle_cold-fusion@9.0.7","className":"Folder","children":[{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\Maid.lua"]},{"name":"ServiceProxy","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\ServiceProxy.lua"]},{"name":"Signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\Signal.lua"]},{"name":"TableUtil","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\TableUtil.lua"]},{"name":"cold-fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\init.luau","Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\default.project.json"],"children":[{"name":"Fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\init.lua"],"children":[{"name":"Animation","className":"Folder","children":[{"name":"Spring","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\Spring.lua"]},{"name":"SpringScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\SpringScheduler.lua"]},{"name":"Tween","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\Tween.lua"]},{"name":"TweenScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\TweenScheduler.lua"]},{"name":"getTweenRatio","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\getTweenRatio.lua"]},{"name":"lerpType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\lerpType.lua"]},{"name":"packType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\packType.lua"]},{"name":"springCoefficients","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\springCoefficients.lua"]},{"name":"unpackType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\unpackType.lua"]}]},{"name":"Colour","className":"Folder","children":[{"name":"Oklab","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Colour\\Oklab.lua"]}]},{"name":"Instances","className":"Folder","children":[{"name":"Attribute","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Attribute.lua"]},{"name":"AttributeChange","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\AttributeChange.lua"]},{"name":"AttributeOut","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\AttributeOut.lua"]},{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Children.lua"]},{"name":"Cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Cleanup.lua"]},{"name":"Hydrate","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Hydrate.lua"]},{"name":"New","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\New.lua"]},{"name":"OnChange","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\OnChange.lua"]},{"name":"OnEvent","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\OnEvent.lua"]},{"name":"Out","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Out.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Ref.lua"]},{"name":"applyInstanceProps","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\applyInstanceProps.lua"]},{"name":"defaultProps","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\defaultProps.lua"]}]},{"name":"Logging","className":"Folder","children":[{"name":"logError","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logError.lua"]},{"name":"logErrorNonFatal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logErrorNonFatal.lua"]},{"name":"logWarn","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logWarn.lua"]},{"name":"messages","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\messages.lua"]},{"name":"parseError","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\parseError.lua"]}]},{"name":"PubTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\PubTypes.lua"]},{"name":"State","className":"Folder","children":[{"name":"Computed","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Computed.lua"]},{"name":"ForKeys","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForKeys.lua"]},{"name":"ForPairs","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForPairs.lua"]},{"name":"ForValues","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForValues.lua"]},{"name":"Observer","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Observer.lua"]},{"name":"Value","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Value.lua"]},{"name":"isState","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\isState.lua"]},{"name":"makeUseCallback","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\makeUseCallback.lua"]},{"name":"peek","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\peek.lua"]},{"name":"updateAll","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\updateAll.lua"]}]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Types.lua"]},{"name":"Utility","className":"Folder","children":[{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\None.lua"]},{"name":"cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\cleanup.lua"]},{"name":"doNothing","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\doNothing.lua"]},{"name":"isSimilar","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\isSimilar.lua"]},{"name":"needsDestruction","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\needsDestruction.lua"]},{"name":"restrictRead","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\restrictRead.lua"]},{"name":"xtypeof","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\xtypeof.lua"]}]}]},{"name":"InstanceTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\InstanceTypes.luau"]},{"name":"Interface","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Interface.luau"]},{"name":"Test.story","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Test.story.luau"]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Types.luau"]},{"name":"Util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Util.luau"]}]}]},{"name":"nightcycle_curve-util@1.0.0","className":"Folder","children":[{"name":"Vector","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\Vector.lua"]},{"name":"curve-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\init.lua","Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\default.project.json"],"children":[{"name":"Ease","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\Ease.lua"]},{"name":"Lerp","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\Lerp.lua"]}]}]},{"name":"nightcycle_format@0.1.3","className":"Folder","children":[{"name":"format","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\init.lua","Packages\\_Index\\nightcycle_format@0.1.3\\format\\default.project.json"],"children":[{"name":"Emoji","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\Emoji.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\init.spec.lua"]}]},{"name":"maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\maid.lua"]},{"name":"signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\signal.lua"]},{"name":"string","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\string.lua"]}]},{"name":"nightcycle_geometry-util@1.1.1","className":"Folder","children":[{"name":"geometry-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\init.lua","Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\default.project.json"],"children":[{"name":"Earcut","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\Earcut\\init.lua"],"children":[{"name":"ZeroArray","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\Earcut\\ZeroArray.lua"]}]}]}]},{"name":"nightcycle_maid@1.1.4","className":"Folder","children":[{"name":"maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\init.lua","Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\default.project.json"],"children":[{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\Maid.lua"]},{"name":"MaidTaskUtils","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\MaidTaskUtils.lua"]}]}]},{"name":"nightcycle_material-icons@1.0.1","className":"Folder","children":[{"name":"material-icons","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\init.luau","Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\default.project.json"],"children":[{"name":"Default_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_1.luau"]},{"name":"Default_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_2.luau"]},{"name":"Default_18_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_3.luau"]},{"name":"Default_18_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_4.luau"]},{"name":"Default_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_1.luau"]},{"name":"Default_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_2.luau"]},{"name":"Default_24_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_3.luau"]},{"name":"Default_24_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_4.luau"]},{"name":"Default_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_1.luau"]},{"name":"Default_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_2.luau"]},{"name":"Default_36_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_3.luau"]},{"name":"Default_36_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_4.luau"]},{"name":"Default_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_1.luau"]},{"name":"Default_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_2.luau"]},{"name":"Default_48_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_3.luau"]},{"name":"Default_48_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_4.luau"]},{"name":"Outlined_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_18_1.luau"]},{"name":"Outlined_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_18_2.luau"]},{"name":"Outlined_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_24_1.luau"]},{"name":"Outlined_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_24_2.luau"]},{"name":"Outlined_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_36_1.luau"]},{"name":"Outlined_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_36_2.luau"]},{"name":"Outlined_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_48_1.luau"]},{"name":"Outlined_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_48_2.luau"]},{"name":"Round_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_18_1.luau"]},{"name":"Round_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_18_2.luau"]},{"name":"Round_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_24_1.luau"]},{"name":"Round_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_24_2.luau"]},{"name":"Round_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_36_1.luau"]},{"name":"Round_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_36_2.luau"]},{"name":"Round_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_48_1.luau"]},{"name":"Round_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_48_2.luau"]},{"name":"Sharp_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_18_1.luau"]},{"name":"Sharp_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_18_2.luau"]},{"name":"Sharp_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_24_1.luau"]},{"name":"Sharp_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_24_2.luau"]},{"name":"Sharp_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_36_1.luau"]},{"name":"Sharp_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_36_2.luau"]},{"name":"Sharp_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_48_1.luau"]},{"name":"Sharp_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_48_2.luau"]},{"name":"TwoTone_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_18_1.luau"]},{"name":"TwoTone_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_18_2.luau"]},{"name":"TwoTone_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_24_1.luau"]},{"name":"TwoTone_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_24_2.luau"]},{"name":"TwoTone_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_36_1.luau"]},{"name":"TwoTone_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_36_2.luau"]},{"name":"TwoTone_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_48_1.luau"]},{"name":"TwoTone_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_48_2.luau"]}]}]},{"name":"nightcycle_mesh-util@1.0.3","className":"Folder","children":[{"name":"GeometryUtil","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\GeometryUtil.lua"]},{"name":"mesh-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\init.lua","Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\default.project.json"],"children":[{"name":"CornerWedgePart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\CornerWedgePart.lua"]},{"name":"Part","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\Part.lua"]},{"name":"TetraPart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\TetraPart.lua"]},{"name":"WedgePart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\WedgePart.lua"]}]}]},{"name":"nightcycle_service-proxy@1.0.0","className":"Folder","children":[{"name":"service-proxy","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_service-proxy@1.0.0\\service-proxy\\src\\init.lua","Packages\\_Index\\nightcycle_service-proxy@1.0.0\\service-proxy\\default.project.json"]}]},{"name":"nightcycle_signal@1.0.2","className":"Folder","children":[{"name":"signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_signal@1.0.2\\signal\\src\\init.lua","Packages\\_Index\\nightcycle_signal@1.0.2\\signal\\default.project.json"]}]},{"name":"nightcycle_string@0.1.0","className":"Folder","children":[{"name":"string","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_string@0.1.0\\string\\src\\init.lua","Packages\\_Index\\nightcycle_string@0.1.0\\string\\default.project.json"],"children":[{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_string@0.1.0\\string\\src\\init.spec.lua"]}]}]},{"name":"nightcycle_table-util@1.1.0","className":"Folder","children":[{"name":"table-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_table-util@1.1.0\\table-util\\src\\init.lua","Packages\\_Index\\nightcycle_table-util@1.1.0\\table-util\\default.project.json"]}]},{"name":"nightcycle_vector@1.0.2","className":"Folder","children":[{"name":"vector","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_vector@1.0.2\\vector\\src\\init.lua","Packages\\_Index\\nightcycle_vector@1.0.2\\vector\\default.project.json"]}]},{"name":"roblox_roact@1.4.4","className":"Folder","children":[{"name":"roact","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\init.lua","Packages\\_Index\\roblox_roact@1.4.4\\roact\\default.project.json"],"children":[{"name":"Binding","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Binding.lua"]},{"name":"Binding.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Binding.spec.lua"]},{"name":"Component","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.lua"]},{"name":"Component.spec","className":"Folder","children":[{"name":"context.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\context.spec.lua"]},{"name":"defaultProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\defaultProps.spec.lua"]},{"name":"didMount.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\didMount.spec.lua"]},{"name":"didUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\didUpdate.spec.lua"]},{"name":"extend.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\extend.spec.lua"]},{"name":"getDerivedStateFromProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\getDerivedStateFromProps.spec.lua"]},{"name":"getElementTraceback.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\getElementTraceback.spec.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\init.spec.lua"]},{"name":"legacyContext.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\legacyContext.spec.lua"]},{"name":"render.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\render.spec.lua"]},{"name":"setState.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\setState.spec.lua"]},{"name":"shouldUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\shouldUpdate.spec.lua"]},{"name":"validateProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\validateProps.spec.lua"]},{"name":"willUnmount.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\willUnmount.spec.lua"]},{"name":"willUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\willUpdate.spec.lua"]}]},{"name":"ComponentLifecyclePhase","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ComponentLifecyclePhase.lua"]},{"name":"Config","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Config.lua"]},{"name":"Config.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Config.spec.lua"]},{"name":"ElementKind","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementKind.lua"]},{"name":"ElementKind.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementKind.spec.lua"]},{"name":"ElementUtils","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementUtils.lua"]},{"name":"ElementUtils.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementUtils.spec.lua"]},{"name":"GlobalConfig","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\GlobalConfig.lua"]},{"name":"GlobalConfig.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\GlobalConfig.spec.lua"]},{"name":"Logging","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Logging.lua"]},{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\None.lua"]},{"name":"NoopRenderer","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\NoopRenderer.lua"]},{"name":"Portal","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Portal.lua"]},{"name":"PropMarkers","className":"Folder","children":[{"name":"Change","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Change.lua"]},{"name":"Change.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Change.spec.lua"]},{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Children.lua"]},{"name":"Event","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Event.lua"]},{"name":"Event.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Event.spec.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Ref.lua"]}]},{"name":"PureComponent","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PureComponent.lua"]},{"name":"PureComponent.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PureComponent.spec.lua"]},{"name":"RobloxRenderer","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\RobloxRenderer.lua"]},{"name":"RobloxRenderer.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\RobloxRenderer.spec.lua"]},{"name":"SingleEventManager","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\SingleEventManager.lua"]},{"name":"SingleEventManager.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\SingleEventManager.spec.lua"]},{"name":"Symbol","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Symbol.lua"]},{"name":"Symbol.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Symbol.spec.lua"]},{"name":"Type","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Type.lua"]},{"name":"Type.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Type.spec.lua"]},{"name":"assertDeepEqual","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assertDeepEqual.lua"]},{"name":"assertDeepEqual.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assertDeepEqual.spec.lua"]},{"name":"assign","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assign.lua"]},{"name":"assign.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assign.spec.lua"]},{"name":"createContext","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createContext.lua"]},{"name":"createContext.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createContext.spec.lua"]},{"name":"createElement","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createElement.lua"]},{"name":"createElement.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createElement.spec.lua"]},{"name":"createFragment","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createFragment.lua"]},{"name":"createFragment.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createFragment.spec.lua"]},{"name":"createReconciler","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconciler.lua"]},{"name":"createReconciler.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconciler.spec.lua"]},{"name":"createReconcilerCompat","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconcilerCompat.lua"]},{"name":"createReconcilerCompat.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconcilerCompat.spec.lua"]},{"name":"createRef","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createRef.lua"]},{"name":"createRef.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createRef.spec.lua"]},{"name":"createSignal","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSignal.lua"]},{"name":"createSignal.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSignal.spec.lua"]},{"name":"createSpy","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSpy.lua"]},{"name":"createSpy.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSpy.spec.lua"]},{"name":"forwardRef","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\forwardRef.lua"]},{"name":"forwardRef.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\forwardRef.spec.lua"]},{"name":"getDefaultInstanceProperty","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\getDefaultInstanceProperty.lua"]},{"name":"getDefaultInstanceProperty.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\getDefaultInstanceProperty.spec.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\init.spec.lua"]},{"name":"internalAssert","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\internalAssert.lua"]},{"name":"invalidSetStateMessages","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\invalidSetStateMessages.lua"]},{"name":"oneChild","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\oneChild.lua"]},{"name":"oneChild.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\oneChild.spec.lua"]},{"name":"strict","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\strict.lua"]},{"name":"strict.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\strict.spec.lua"]}]}]}]},{"name":"synthetic","className":"ModuleScript","filePaths":["src\\init.luau"],"children":[{"name":"Component","className":"Folder","children":[{"name":"Button","className":"Folder","children":[{"name":"Base","className":"ModuleScript","filePaths":["src\\Component\\Button\\Base.luau"]},{"name":"ElevatedButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\ElevatedButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\ElevatedButton\\cfusion.story.luau"]}]},{"name":"ExtendedFAB","className":"ModuleScript","filePaths":["src\\Component\\Button\\ExtendedFAB\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\ExtendedFAB\\cfusion.story.luau"]}]},{"name":"FAB","className":"ModuleScript","filePaths":["src\\Component\\Button\\FAB\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\FAB\\cfusion.story.luau"]}]},{"name":"FilledButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledButton\\cfusion.story.luau"]}]},{"name":"FilledIconButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledIconButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledIconButton\\cfusion.story.luau"]}]},{"name":"IconButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\IconButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\IconButton\\cfusion.story.luau"]}]},{"name":"OutlinedButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedButton\\cfusion.story.luau"]}]},{"name":"OutlinedIconButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedIconButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedIconButton\\cfusion.story.luau"]}]},{"name":"TextButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\TextButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\TextButton\\cfusion.story.luau"]}]}]}]},{"name":"Config","className":"ModuleScript","filePaths":["src\\Config.luau"]},{"name":"Enums","className":"ModuleScript","filePaths":["src\\Enums.luau"]},{"name":"Sounds","className":"ModuleScript","filePaths":["src\\Sounds.luau"]},{"name":"Test","className":"Folder","children":[{"name":"Source.cfusion","className":"ModuleScript","filePaths":["src\\Test\\Source.cfusion.luau"]}]},{"name":"Types","className":"ModuleScript","filePaths":["src\\Types.luau"]},{"name":"Util","className":"ModuleScript","filePaths":["src\\Util.luau"]}]}]}]}]} \ No newline at end of file diff --git a/src/Component/Button/Base.luau b/src/Component/Button/Base.luau index 9debd878..dc4f86ab 100644 --- a/src/Component/Button/Base.luau +++ b/src/Component/Button/Base.luau @@ -45,7 +45,8 @@ return function ( scale: CanBeState, sound: CanBeState, hasMinimumSize: CanBeState?, - cornerRadius: CanBeState? + cornerRadius: CanBeState?, + paddingScale: CanBeState? ): ImageLabel local _fuse = ColdFusion.fuse(maid) @@ -97,6 +98,7 @@ return function ( local isDropShadowState = _import(isDropShadow, false) local hasMinState = _import(hasMinimumSize, true) local cornerRadiusState = _import(cornerRadius, SHAPE_DP) + local paddingScaleState = _import(paddingScale, 1) local inst: ImageLabel = _new("ImageLabel")({ Image = "rbxassetid://15549395120", @@ -239,31 +241,41 @@ return function ( ImageTransparency = _Computed(function(icon: ImageData?, style: TextStyle?): number return if icon and style then style.TextTransparency else 1 end, iconState, currentStyleState), + SizeConstraint = Enum.SizeConstraint.RelativeYY, Size = _Computed(function(s: number): UDim2 - return UDim2.fromOffset(s * ICON_SIZE_DP, s * ICON_SIZE_DP) + return UDim2.fromScale(1,1) + -- return UDim2.fromOffset(s * ICON_SIZE_DP, s * ICON_SIZE_DP) end, scaleState), }), _new("UIPadding")({ - PaddingLeft = _Computed(function(s: number, icon: ImageData?, txt: string): UDim - if icon and txt:len() > 0 then - return UDim.new(0, LEFT_PADDING_WITH_ICON_DP * s) + PaddingLeft = _Computed(function(s: number, icon: ImageData?, txt: string, padScale: number): UDim + if icon then + if txt:len() > 0 then + return UDim.new(0, padScale * LEFT_PADDING_WITH_ICON_DP * s) + else + return UDim.new(0, padScale * s * (HEIGHT_DP-ICON_SIZE_DP) / 2) + end else - return UDim.new(0, LEFT_RIGHT_PADDING_DP * s) + return UDim.new(0, padScale * LEFT_RIGHT_PADDING_DP * s) end - end, scaleState, iconState, textState), - PaddingRight = _Computed(function(s: number, icon: ImageData?, txt: string): UDim - if icon and txt:len() > 0 then - return UDim.new(0, RIGHT_PADDING_WITH_ICON_DP * s) + end, scaleState, iconState, textState, paddingScaleState), + PaddingRight = _Computed(function(s: number, icon: ImageData?, txt: string, padScale: number): UDim + if icon then + if txt:len() > 0 then + return UDim.new(0, padScale * RIGHT_PADDING_WITH_ICON_DP * s) + else + return UDim.new(0, padScale * s * (HEIGHT_DP-ICON_SIZE_DP) / 2) + end else - return UDim.new(0, LEFT_RIGHT_PADDING_DP * s) + return UDim.new(0, padScale * LEFT_RIGHT_PADDING_DP * s) end - end, scaleState, iconState, textState), - PaddingTop = _Computed(function(s: number): UDim - return UDim.new(0, s * (HEIGHT_DP-ICON_SIZE_DP) / 2) - end, scaleState), - PaddingBottom = _Computed(function(s: number): UDim - return UDim.new(0, s * (HEIGHT_DP-ICON_SIZE_DP) / 2) - end, scaleState), + end, scaleState, iconState, textState, paddingScaleState), + PaddingTop = _Computed(function(s: number, padScale: number): UDim + return UDim.new(0, padScale * s * (HEIGHT_DP-ICON_SIZE_DP) / 2) + end, scaleState, paddingScaleState), + PaddingBottom = _Computed(function(s: number, padScale: number): UDim + return UDim.new(0, padScale * s * (HEIGHT_DP-ICON_SIZE_DP) / 2) + end, scaleState, paddingScaleState), }), _new("UISizeConstraint")({ MaxSize = Vector2.new(math.huge, math.huge), diff --git a/src/Component/Button/FAB/cfusion.story.luau b/src/Component/Button/FAB/cfusion.story.luau index 20e27d58..3827ddb3 100644 --- a/src/Component/Button/FAB/cfusion.story.luau +++ b/src/Component/Button/FAB/cfusion.story.luau @@ -74,18 +74,6 @@ return function(frame: Frame) button.Parent = halfFrame end - do - local button = maid:GiveTask(Module.cfusion( - function() - print("click") - end, - img, - theme, - true - )) - button.Parent = halfFrame - end - return halfFrame end diff --git a/src/Component/Button/FilledIconButton/cfusion.story.luau b/src/Component/Button/FilledIconButton/cfusion.story.luau new file mode 100644 index 00000000..3827ddb3 --- /dev/null +++ b/src/Component/Button/FilledIconButton/cfusion.story.luau @@ -0,0 +1,115 @@ +--!strict +local _Package = script.Parent.Parent.Parent.Parent +local _Packages = _Package.Parent +-- Services +-- Packages +local Maid = require(_Packages:WaitForChild("Maid")) +local MaterialIcons = require(_Packages:WaitForChild("MaterialIcons")) + +-- Modules +local Types = require(_Package:WaitForChild("Types")) +-- Types +-- Constants +local SCALE = 1 +-- Variables +-- References +local Icons = MaterialIcons.default.dp_48.scale_1 + +-- Class +return function(frame: Frame) + local maid = Maid.new() + task.spawn(function() + local function makeHalfFrame( + isDarkMode: boolean, + color: Color3 + ): Frame + + local halfFrame = maid:GiveTask(Instance.new("Frame")) + halfFrame.BackgroundColor3 = if isDarkMode then Color3.new(0.15,0.15,0.15) else Color3.new(0.85, 0.85, 0.85) + + local listLayout = maid:GiveTask(Instance.new("UIListLayout")) + listLayout.FillDirection = Enum.FillDirection.Vertical + listLayout.Padding = UDim.new(0, 10) + listLayout.VerticalAlignment = Enum.VerticalAlignment.Center + listLayout.HorizontalAlignment = Enum.HorizontalAlignment.Center + listLayout.Parent = halfFrame + + local img = Types.newImageData( + Icons.voice_chat.Image, + Icons.voice_chat.ImageRectOffset, + Icons.voice_chat.ImageRectSize + ) + + local Module = require(script.Parent) + local theme = Types.newThemeData( + 1, + isDarkMode, + SCALE, + Font.fromEnum(Enum.Font.SourceSans), + color, + halfFrame.BackgroundColor3 + ) + + do + local button = maid:GiveTask(Module.cfusion( + function() + print("click") + end, + img, + theme, + nil + )) + button.Parent = halfFrame + end + + do + local button = maid:GiveTask(Module.cfusion( + function() + print("click") + end, + img, + theme, + false + )) + button.Parent = halfFrame + end + + return halfFrame + end + + local COLORS: {[number]: Color3} = { + Color3.fromHSV(0, 0.9, 0.8), + Color3.fromHSV(0, 0.25, 0.8), + Color3.fromHSV(0, 0.9, 0.5), + Color3.fromHSV(0.6, 0.9, 0.7), + Color3.fromHSV(0.35, 0.9, 0.7), + Color3.fromHSV(0.1, 0.9, 0.7), + } + + for i, color in ipairs(COLORS) do + local x = (i-1)/(#COLORS) + local width = 1/(#COLORS) + local dark = makeHalfFrame( + true, + color + ) + + dark.Size = UDim2.fromScale(width, 0.5) + dark.Position = UDim2.fromScale(x, 0.5) + dark.Parent = frame + + local bright = makeHalfFrame( + false, + color + ) + bright.Size = UDim2.fromScale(width, 0.5) + bright.Position = UDim2.fromScale(x, 0) + bright.Parent = frame + + end + + end) + return function() + maid:Destroy() + end +end \ No newline at end of file diff --git a/src/Component/Button/FilledIconButton/init.luau b/src/Component/Button/FilledIconButton/init.luau new file mode 100644 index 00000000..0eadeb6a --- /dev/null +++ b/src/Component/Button/FilledIconButton/init.luau @@ -0,0 +1,185 @@ +--!strict +local _Package = script.Parent.Parent.Parent +local _Packages = _Package.Parent +-- Services + +-- Packages +local Maid = require(_Packages:WaitForChild("Maid")) +local ColdFusion = require(_Packages:WaitForChild("ColdFusion")) + +-- Modules +local Sounds = require(_Package:WaitForChild("Sounds")) +local Enums = require(_Package:WaitForChild("Enums")) +local Types = require(_Package:WaitForChild("Types")) +local Config = require(_Package:WaitForChild("Config")) +local Util = require(_Package:WaitForChild("Util")) +local Base = require(script.Parent:WaitForChild("Base")) + +-- Types +type Maid = Maid.Maid +type State = ColdFusion.State +type ValueState = ColdFusion.ValueState +type CanBeState = ColdFusion.CanBeState +type TextStyle = Types.TextStyle +type ImageData = Types.ImageData +type ThemeData = Types.ThemeData +-- Constants +local DEFAULT_VOLUME = Config.Sound.Volume +local DISABLE_TRANSPARENCY = Config.Transparency.Text.Disabled +local DISABLE_BACK_TRANS = Config.Transparency.Background.Disabled + +-- Variables +-- References +-- Private Functions + + +-- Class +local Interface = {} + +function Interface.cfusion( + onClick: CanBeState<() -> ()>, + icon: CanBeState, + theme: CanBeState, + isEnabled: CanBeState? +): ImageLabel + local maid = Maid.new() + + local _fuse = ColdFusion.fuse(maid) + + local _new = _fuse.new + local _bind = _fuse.bind + local _clone = _fuse.clone + local _import = _fuse.import + + local _Value = _fuse.Value + local _Computed = _fuse.Computed + + local onClickState = _import(onClick, function() end) + local themeState = _import(theme, Types.newThemeData( + 1, + false, + 1, + Font.fromEnum(Enum.Font.SourceSansSemibold), + Color3.fromHSV(0.8, 0.4, 0.8) + )) + + local sound = maid:GiveTask(Instance.new("Sound")) + sound.Volume = DEFAULT_VOLUME + sound.SoundId = Sounds.ui_tap_variant_01 + + local styles = _Computed(function(thm: ThemeData): {[Enums.ButtonStateType]: TextStyle} + local backColor: Color3? + local textColor: Color3? + + if thm.IsDarkMode then + backColor = Util.getReadableColor( + thm.Color3, + if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.DARK_SURFACE + ) + assert(backColor) + + textColor = Util.DARK_SURFACE + else + backColor = Util.getReadableColor( + thm.Color3, + if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.LIGHT_SURFACE + ) + assert(backColor) + + textColor = Util.LIGHT_SURFACE + end + assert(backColor) + assert(textColor) + + backColor = Util.getElevatedColor( + backColor, + thm.Elevation, + thm.IsDarkMode + ) + + textColor = Util.getElevatedColor( + textColor, + thm.Elevation, + thm.IsDarkMode + ) + + local disableBackColor = (function(): Color3 + local h,s,v = backColor:ToHSV() + return Color3.fromHSV(h,s*0,v) + end)() + + local data = { + [Enums.ButtonStateType.Enabled] = Types.newTextStyle( + textColor, + 0, + backColor, + 0, + textColor, + 1 + ), + [Enums.ButtonStateType.Disabled] = Types.newTextStyle( + (function(): Color3 + if thm.IsDarkMode then + return Util.LIGHT_SURFACE + else + return Util.DARK_SURFACE + end + end)(), + DISABLE_TRANSPARENCY, + disableBackColor, + DISABLE_BACK_TRANS, + textColor, + 1 + ), + [Enums.ButtonStateType.Focused] = Types.newTextStyle( + textColor, + 0, + backColor, + 0, + textColor, + 1 + ), + [Enums.ButtonStateType.Hovered] = Types.newTextStyle( + textColor, + 0, + backColor, + 0, + textColor, + 1 + ), + [Enums.ButtonStateType.Pressed] = Types.newTextStyle( + textColor, + 0, + backColor, + 0, + textColor, + 1 + ), + } + return data + end, themeState) + + local button = Base( + maid, + onClickState, + "", + _Computed(function(t: ThemeData): Font + return t.Font + end, themeState), + styles, + icon, + if isEnabled == nil then true else isEnabled, + false, + _Computed(function(t: ThemeData): number + return t.Scale*0.85 + end, themeState), + sound, + false, + nil, + 0.75 + ) + maid.bind(button) + return button +end + +return Interface \ No newline at end of file diff --git a/src/Component/Button/IconButton/cfusion.story.luau b/src/Component/Button/IconButton/cfusion.story.luau new file mode 100644 index 00000000..3827ddb3 --- /dev/null +++ b/src/Component/Button/IconButton/cfusion.story.luau @@ -0,0 +1,115 @@ +--!strict +local _Package = script.Parent.Parent.Parent.Parent +local _Packages = _Package.Parent +-- Services +-- Packages +local Maid = require(_Packages:WaitForChild("Maid")) +local MaterialIcons = require(_Packages:WaitForChild("MaterialIcons")) + +-- Modules +local Types = require(_Package:WaitForChild("Types")) +-- Types +-- Constants +local SCALE = 1 +-- Variables +-- References +local Icons = MaterialIcons.default.dp_48.scale_1 + +-- Class +return function(frame: Frame) + local maid = Maid.new() + task.spawn(function() + local function makeHalfFrame( + isDarkMode: boolean, + color: Color3 + ): Frame + + local halfFrame = maid:GiveTask(Instance.new("Frame")) + halfFrame.BackgroundColor3 = if isDarkMode then Color3.new(0.15,0.15,0.15) else Color3.new(0.85, 0.85, 0.85) + + local listLayout = maid:GiveTask(Instance.new("UIListLayout")) + listLayout.FillDirection = Enum.FillDirection.Vertical + listLayout.Padding = UDim.new(0, 10) + listLayout.VerticalAlignment = Enum.VerticalAlignment.Center + listLayout.HorizontalAlignment = Enum.HorizontalAlignment.Center + listLayout.Parent = halfFrame + + local img = Types.newImageData( + Icons.voice_chat.Image, + Icons.voice_chat.ImageRectOffset, + Icons.voice_chat.ImageRectSize + ) + + local Module = require(script.Parent) + local theme = Types.newThemeData( + 1, + isDarkMode, + SCALE, + Font.fromEnum(Enum.Font.SourceSans), + color, + halfFrame.BackgroundColor3 + ) + + do + local button = maid:GiveTask(Module.cfusion( + function() + print("click") + end, + img, + theme, + nil + )) + button.Parent = halfFrame + end + + do + local button = maid:GiveTask(Module.cfusion( + function() + print("click") + end, + img, + theme, + false + )) + button.Parent = halfFrame + end + + return halfFrame + end + + local COLORS: {[number]: Color3} = { + Color3.fromHSV(0, 0.9, 0.8), + Color3.fromHSV(0, 0.25, 0.8), + Color3.fromHSV(0, 0.9, 0.5), + Color3.fromHSV(0.6, 0.9, 0.7), + Color3.fromHSV(0.35, 0.9, 0.7), + Color3.fromHSV(0.1, 0.9, 0.7), + } + + for i, color in ipairs(COLORS) do + local x = (i-1)/(#COLORS) + local width = 1/(#COLORS) + local dark = makeHalfFrame( + true, + color + ) + + dark.Size = UDim2.fromScale(width, 0.5) + dark.Position = UDim2.fromScale(x, 0.5) + dark.Parent = frame + + local bright = makeHalfFrame( + false, + color + ) + bright.Size = UDim2.fromScale(width, 0.5) + bright.Position = UDim2.fromScale(x, 0) + bright.Parent = frame + + end + + end) + return function() + maid:Destroy() + end +end \ No newline at end of file diff --git a/src/Component/Button/IconButton/init.luau b/src/Component/Button/IconButton/init.luau new file mode 100644 index 00000000..99fa8fd1 --- /dev/null +++ b/src/Component/Button/IconButton/init.luau @@ -0,0 +1,173 @@ +--!strict +local _Package = script.Parent.Parent.Parent +local _Packages = _Package.Parent +-- Services + +-- Packages +local Maid = require(_Packages:WaitForChild("Maid")) +local ColdFusion = require(_Packages:WaitForChild("ColdFusion")) + +-- Modules +local Sounds = require(_Package:WaitForChild("Sounds")) +local Enums = require(_Package:WaitForChild("Enums")) +local Types = require(_Package:WaitForChild("Types")) +local Config = require(_Package:WaitForChild("Config")) +local Util = require(_Package:WaitForChild("Util")) +local Base = require(script.Parent:WaitForChild("Base")) + +-- Types +type Maid = Maid.Maid +type State = ColdFusion.State +type ValueState = ColdFusion.ValueState +type CanBeState = ColdFusion.CanBeState +type TextStyle = Types.TextStyle +type ImageData = Types.ImageData +type ThemeData = Types.ThemeData +-- Constants +local DEFAULT_VOLUME = Config.Sound.Volume +local HOVER_TRANSPARENCY = Config.Transparency.Background.Hovered +local FOCUS_TRANSPARENCY = Config.Transparency.Background.Focused +local PRESS_TRANSPARENCY = Config.Transparency.Background.Pressed +local DISABLE_TRANSPARENCY = Config.Transparency.Text.Disabled + +-- Variables +-- References +-- Private Functions + + +-- Class +local Interface = {} + +function Interface.cfusion( + onClick: CanBeState<() -> ()>, + icon: CanBeState, + theme: CanBeState, + isEnabled: CanBeState? +): ImageLabel + local maid = Maid.new() + + local _fuse = ColdFusion.fuse(maid) + + local _new = _fuse.new + local _bind = _fuse.bind + local _clone = _fuse.clone + local _import = _fuse.import + + local _Value = _fuse.Value + local _Computed = _fuse.Computed + + local onClickState = _import(onClick, function() end) + local themeState = _import(theme, Types.newThemeData( + 1, + false, + 1, + Font.fromEnum(Enum.Font.SourceSansSemibold), + Color3.fromHSV(0.8, 0.4, 0.8) + )) + + local sound = maid:GiveTask(Instance.new("Sound")) + sound.Volume = DEFAULT_VOLUME + sound.SoundId = Sounds.ui_tap_variant_01 + + local styles = _Computed(function(thm: ThemeData): {[Enums.ButtonStateType]: TextStyle} + local textColor: Color3? + if thm.IsDarkMode then + textColor = Util.getReadableColor( + thm.Color3, + if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.DARK_SURFACE + ) + else + textColor = Util.getReadableColor( + thm.Color3, + if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.LIGHT_SURFACE + ) + end + assert(textColor) + textColor = Util.getElevatedColor( + textColor, + thm.Elevation, + thm.IsDarkMode + ) + local data = { + [Enums.ButtonStateType.Enabled] = Types.newTextStyle( + textColor, + 0, + textColor, + 1, + textColor, + 1 + ), + [Enums.ButtonStateType.Disabled] = Types.newTextStyle( + (function(): Color3 + if thm.IsDarkMode then + local h,_s,v = textColor:ToHSV() + return Util.getReadableColor( + Color3.fromHSV(h,0,v), + if thm.BackgroundColor3 then thm.BackgroundColor3 else Color3.new(0.15,0.15,0.15) + ) + else + local h,_s,v = textColor:ToHSV() + return Util.getReadableColor( + Color3.fromHSV(h,0,v), + if thm.BackgroundColor3 then thm.BackgroundColor3 else Color3.new(0.85,0.85,0.85) + ) + end + end)(), + DISABLE_TRANSPARENCY, + textColor, + 1, + textColor, + 1 + ), + [Enums.ButtonStateType.Focused] = Types.newTextStyle( + textColor, + 0, + textColor, + FOCUS_TRANSPARENCY, + textColor, + 1 + ), + [Enums.ButtonStateType.Hovered] = Types.newTextStyle( + textColor, + 0, + textColor, + HOVER_TRANSPARENCY, + textColor, + 1 + ), + [Enums.ButtonStateType.Pressed] = Types.newTextStyle( + textColor, + 0, + textColor, + PRESS_TRANSPARENCY, + textColor, + 1 + ), + } + return data + end, themeState) + + local button = Base( + maid, + onClickState, + "", + _Computed(function(t: ThemeData): Font + return t.Font + end, themeState), + styles, + icon, + if isEnabled == nil then true else isEnabled, + false, + _Computed(function(t: ThemeData): number + return t.Scale + end, themeState), + sound, + false, + nil, + 0.75 + ) + maid.bind(button) + return button +end + +return Interface \ No newline at end of file diff --git a/src/Component/Button/OutlinedIconButton/cfusion.story.luau b/src/Component/Button/OutlinedIconButton/cfusion.story.luau new file mode 100644 index 00000000..3827ddb3 --- /dev/null +++ b/src/Component/Button/OutlinedIconButton/cfusion.story.luau @@ -0,0 +1,115 @@ +--!strict +local _Package = script.Parent.Parent.Parent.Parent +local _Packages = _Package.Parent +-- Services +-- Packages +local Maid = require(_Packages:WaitForChild("Maid")) +local MaterialIcons = require(_Packages:WaitForChild("MaterialIcons")) + +-- Modules +local Types = require(_Package:WaitForChild("Types")) +-- Types +-- Constants +local SCALE = 1 +-- Variables +-- References +local Icons = MaterialIcons.default.dp_48.scale_1 + +-- Class +return function(frame: Frame) + local maid = Maid.new() + task.spawn(function() + local function makeHalfFrame( + isDarkMode: boolean, + color: Color3 + ): Frame + + local halfFrame = maid:GiveTask(Instance.new("Frame")) + halfFrame.BackgroundColor3 = if isDarkMode then Color3.new(0.15,0.15,0.15) else Color3.new(0.85, 0.85, 0.85) + + local listLayout = maid:GiveTask(Instance.new("UIListLayout")) + listLayout.FillDirection = Enum.FillDirection.Vertical + listLayout.Padding = UDim.new(0, 10) + listLayout.VerticalAlignment = Enum.VerticalAlignment.Center + listLayout.HorizontalAlignment = Enum.HorizontalAlignment.Center + listLayout.Parent = halfFrame + + local img = Types.newImageData( + Icons.voice_chat.Image, + Icons.voice_chat.ImageRectOffset, + Icons.voice_chat.ImageRectSize + ) + + local Module = require(script.Parent) + local theme = Types.newThemeData( + 1, + isDarkMode, + SCALE, + Font.fromEnum(Enum.Font.SourceSans), + color, + halfFrame.BackgroundColor3 + ) + + do + local button = maid:GiveTask(Module.cfusion( + function() + print("click") + end, + img, + theme, + nil + )) + button.Parent = halfFrame + end + + do + local button = maid:GiveTask(Module.cfusion( + function() + print("click") + end, + img, + theme, + false + )) + button.Parent = halfFrame + end + + return halfFrame + end + + local COLORS: {[number]: Color3} = { + Color3.fromHSV(0, 0.9, 0.8), + Color3.fromHSV(0, 0.25, 0.8), + Color3.fromHSV(0, 0.9, 0.5), + Color3.fromHSV(0.6, 0.9, 0.7), + Color3.fromHSV(0.35, 0.9, 0.7), + Color3.fromHSV(0.1, 0.9, 0.7), + } + + for i, color in ipairs(COLORS) do + local x = (i-1)/(#COLORS) + local width = 1/(#COLORS) + local dark = makeHalfFrame( + true, + color + ) + + dark.Size = UDim2.fromScale(width, 0.5) + dark.Position = UDim2.fromScale(x, 0.5) + dark.Parent = frame + + local bright = makeHalfFrame( + false, + color + ) + bright.Size = UDim2.fromScale(width, 0.5) + bright.Position = UDim2.fromScale(x, 0) + bright.Parent = frame + + end + + end) + return function() + maid:Destroy() + end +end \ No newline at end of file diff --git a/src/Component/Button/OutlinedIconButton/init.luau b/src/Component/Button/OutlinedIconButton/init.luau new file mode 100644 index 00000000..c403fcba --- /dev/null +++ b/src/Component/Button/OutlinedIconButton/init.luau @@ -0,0 +1,179 @@ +--!strict +local _Package = script.Parent.Parent.Parent +local _Packages = _Package.Parent +-- Services + +-- Packages +local Maid = require(_Packages:WaitForChild("Maid")) +local ColdFusion = require(_Packages:WaitForChild("ColdFusion")) + +-- Modules +local Sounds = require(_Package:WaitForChild("Sounds")) +local Enums = require(_Package:WaitForChild("Enums")) +local Types = require(_Package:WaitForChild("Types")) +local Config = require(_Package:WaitForChild("Config")) +local Util = require(_Package:WaitForChild("Util")) +local Base = require(script.Parent:WaitForChild("Base")) + +-- Types +type Maid = Maid.Maid +type State = ColdFusion.State +type ValueState = ColdFusion.ValueState +type CanBeState = ColdFusion.CanBeState +type TextStyle = Types.TextStyle +type ImageData = Types.ImageData +type ThemeData = Types.ThemeData +-- Constants +local DEFAULT_VOLUME = Config.Sound.Volume +local HOVER_TRANSPARENCY = Config.Transparency.Background.Hovered +local FOCUS_TRANSPARENCY = Config.Transparency.Background.Focused +local PRESS_TRANSPARENCY = Config.Transparency.Background.Pressed +local DISABLE_TRANSPARENCY = Config.Transparency.Text.Disabled + +-- Variables +-- References +-- Private Functions + + +-- Class +local Interface = {} + +function Interface.cfusion( + onClick: CanBeState<() -> ()>, + icon: CanBeState, + theme: CanBeState, + isEnabled: CanBeState? +): ImageLabel + local maid = Maid.new() + + local _fuse = ColdFusion.fuse(maid) + + local _new = _fuse.new + local _bind = _fuse.bind + local _clone = _fuse.clone + local _import = _fuse.import + + local _Value = _fuse.Value + local _Computed = _fuse.Computed + + local onClickState = _import(onClick, function() end) + local themeState = _import(theme, Types.newThemeData( + 1, + false, + 1, + Font.fromEnum(Enum.Font.SourceSansSemibold), + Color3.fromHSV(0.8, 0.4, 0.8) + )) + + local sound = maid:GiveTask(Instance.new("Sound")) + sound.Volume = DEFAULT_VOLUME + sound.SoundId = Sounds.ui_tap_variant_01 + + local styles = _Computed(function(thm: ThemeData): {[Enums.ButtonStateType]: TextStyle} + local textColor: Color3? + if thm.IsDarkMode then + textColor = Util.getReadableColor( + thm.Color3, + if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.DARK_SURFACE, + 12 + ) + else + textColor = Util.getReadableColor( + thm.Color3, + if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.LIGHT_SURFACE, + 5 + ) + end + assert(textColor) + textColor = Util.getElevatedColor( + textColor, + thm.Elevation, + thm.IsDarkMode + ) + local borderColor = (function() + local h,s,v = textColor:ToHSV() + return Color3.fromHSV(h,s*0.25,v*0.8) + end)() + local data = { + [Enums.ButtonStateType.Enabled] = Types.newTextStyle( + textColor, + 0, + textColor, + 1, + borderColor, + 0 + ), + [Enums.ButtonStateType.Disabled] = Types.newTextStyle( + (function(): Color3 + if thm.IsDarkMode then + local h,_s,v = textColor:ToHSV() + return Util.getReadableColor( + Color3.fromHSV(h,0,v), + if thm.BackgroundColor3 then thm.BackgroundColor3 else Color3.new(0.15,0.15,0.15) + ) + else + local h,_s,v = textColor:ToHSV() + return Util.getReadableColor( + Color3.fromHSV(h,0,v), + if thm.BackgroundColor3 then thm.BackgroundColor3 else Color3.new(0.85,0.85,0.85) + ) + end + end)(), + DISABLE_TRANSPARENCY, + textColor, + 1, + borderColor, + DISABLE_TRANSPARENCY + ), + [Enums.ButtonStateType.Focused] = Types.newTextStyle( + textColor, + 0, + textColor, + FOCUS_TRANSPARENCY, + textColor, + FOCUS_TRANSPARENCY + ), + [Enums.ButtonStateType.Hovered] = Types.newTextStyle( + textColor, + 0, + textColor, + HOVER_TRANSPARENCY, + borderColor, + HOVER_TRANSPARENCY + ), + [Enums.ButtonStateType.Pressed] = Types.newTextStyle( + textColor, + 0, + textColor, + PRESS_TRANSPARENCY, + borderColor, + PRESS_TRANSPARENCY + ), + } + return data + end, themeState) + + local button = Base( + maid, + onClickState, + "", + _Computed(function(t: ThemeData): Font + return t.Font + end, themeState), + styles, + icon, + if isEnabled == nil then true else isEnabled, + false, + _Computed(function(t: ThemeData): number + return t.Scale*0.85 + end, themeState), + sound, + false, + nil, + 0.75 + ) + maid.bind(button) + return button +end + +return Interface \ No newline at end of file diff --git a/src/Component/Button/TextButton/init.luau b/src/Component/Button/TextButton/init.luau index acc9723f..0912aca5 100644 --- a/src/Component/Button/TextButton/init.luau +++ b/src/Component/Button/TextButton/init.luau @@ -78,7 +78,6 @@ function Interface.cfusion( thm.Color3, if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.DARK_SURFACE ) - else textColor = Util.getReadableColor( thm.Color3, From 64da7beeaab696a2fd088cb3f466639c22401a38 Mon Sep 17 00:00:00 2001 From: Nightcycle <77173389+nightcycle@users.noreply.github.com> Date: Tue, 5 Dec 2023 21:07:21 -0500 Subject: [PATCH 10/57] Added ripple effect --- src/Component/Button/Base.luau | 92 +++++++++++++++++-- src/Component/Button/ElevatedButton/init.luau | 6 +- src/Component/Button/ExtendedFAB/init.luau | 4 +- src/Component/Button/FAB/init.luau | 4 +- src/Component/Button/FilledButton/init.luau | 6 +- .../Button/FilledIconButton/init.luau | 3 +- synthetic.rbxl.lock | 2 +- 7 files changed, 104 insertions(+), 13 deletions(-) diff --git a/src/Component/Button/Base.luau b/src/Component/Button/Base.luau index dc4f86ab..6d190f22 100644 --- a/src/Component/Button/Base.luau +++ b/src/Component/Button/Base.luau @@ -4,10 +4,12 @@ local _Package = script.Parent.Parent.Parent local _Packages = _Package.Parent -- Services local SoundService = game:GetService("SoundService") +local RunService = game:GetService("RunService") -- Packages local Maid = require(_Packages:WaitForChild("Maid")) local ColdFusion = require(_Packages:WaitForChild("ColdFusion")) +local CurveUtil = require(_Packages:WaitForChild("CurveUtil")) -- Modules local Enums = require(_Package:WaitForChild("Enums")) @@ -32,6 +34,7 @@ local RIGHT_PADDING_WITH_ICON_DP = 16 local PADDING_BETWEEN_ELEMENTS_DP = 8 local LABEL_TEXT_ALIGNMENT = Enum.TextXAlignment.Center local IMAGE_SIZE = 500 +local RIP_STEP = 0.005 local HALF_IMAGE_SIZE = IMAGE_SIZE/2 return function ( maid: Maid, @@ -46,7 +49,8 @@ return function ( sound: CanBeState, hasMinimumSize: CanBeState?, cornerRadius: CanBeState?, - paddingScale: CanBeState? + paddingScale: CanBeState?, + useRipple: CanBeState? ): ImageLabel local _fuse = ColdFusion.fuse(maid) @@ -99,8 +103,58 @@ return function ( local hasMinState = _import(hasMinimumSize, true) local cornerRadiusState = _import(cornerRadius, SHAPE_DP) local paddingScaleState = _import(paddingScale, 1) - - local inst: ImageLabel = _new("ImageLabel")({ + local useRippleState = _import(useRipple, false) + + local inst: ImageLabel + + local rippleColorState: ValueState = _Value(nil :: ColorSequence?) + + local function ripple(clickPosition: Vector2) + local runMaid = Maid.new() + local alpha = 0 + local xStart = inst.AbsolutePosition.X + + local initialAlpha = math.clamp((clickPosition.X - xStart)/inst.AbsoluteSize.X, 0, 1) + + runMaid:GiveTask(RunService.RenderStepped:Connect(function(deltaTime: number) + alpha += deltaTime / 0.6 + + local moveAlpha = 1-CurveUtil.ease( + 1-math.clamp(alpha/0.5, 0, 1), + Enum.EasingStyle.Quad, + Enum.EasingDirection.In + ) + local fadeAlpha = CurveUtil.ease( + math.clamp((alpha-0.1)/0.7, 0, 1), + Enum.EasingStyle.Quad, + Enum.EasingDirection.In + ) + + local baseColor = (stylesState:Get()[Enums.ButtonStateType.Enabled] :: TextStyle).BackgroundColor3 + local rippleColor = (Color3.new(1,1,1):Lerp(baseColor, 0.8)):Lerp(baseColor, fadeAlpha) + + local leftOffset = math.clamp(initialAlpha - moveAlpha, RIP_STEP, math.max(initialAlpha-RIP_STEP, RIP_STEP*1.5)) + local rightOffset = math.clamp(initialAlpha + moveAlpha, math.min(initialAlpha+RIP_STEP, 1-RIP_STEP*1.5), 1-RIP_STEP) + + rippleColorState:Set(ColorSequence.new({ + ColorSequenceKeypoint.new(0, baseColor), + ColorSequenceKeypoint.new(leftOffset-RIP_STEP*0.5, baseColor), + ColorSequenceKeypoint.new(leftOffset, rippleColor), + ColorSequenceKeypoint.new(rightOffset, rippleColor), + ColorSequenceKeypoint.new(rightOffset+RIP_STEP*0.5, baseColor), + ColorSequenceKeypoint.new(1, baseColor), + })) + + if alpha >= 1 then + rippleColorState:Set(nil) + runMaid:Destroy() + end + end)) + maid._ripple = runMaid + end + + + inst = _new("ImageLabel")({ Image = "rbxassetid://15549395120", ImageColor3 = Color3.new(0,0,0), BackgroundTransparency = 1, @@ -131,9 +185,10 @@ return function ( BackgroundTransparency = _Computed(function(style: TextStyle): number return style.BackgroundTransparency end, currentStyleState), - BackgroundColor3 = _Computed(function(style: TextStyle): Color3 + BackgroundColor3 = _Computed(function(style: TextStyle, useRip: boolean): Color3 + if useRip then return Color3.new(1,1,1) end return style.BackgroundColor3 - end, currentStyleState), + end, currentStyleState, useRippleState), Active = isEnabledState, AutomaticSize = Enum.AutomaticSize.X, Size = _Computed(function(s: number): UDim2 @@ -149,10 +204,20 @@ return function ( end click() end, - MouseButton1Down = function(inputObject: InputObject) + MouseButton1Down = function(x: number, y: number) + if isEnabledState:Get() == false then return end isPressedState:Set(true) end, - MouseButton1Up = function(inputObject: InputObject) + MouseButton1Up = function(x: number, y: number) + if isEnabledState:Get() == false then return end + if useRippleState:Get() then + ripple( + Vector2.new( + x, + y + ) + ) + end isPressedState:Set(false) end, MouseEnter = function() @@ -174,6 +239,19 @@ return function ( return UDim.new(0, s * cornerRad) end, scaleState, cornerRadiusState), }), + _new("UIGradient")({ + Color = _Computed(function(useRip: boolean, style: TextStyle, seq: ColorSequence?): ColorSequence + if useRip then + if seq then + return seq + else + return ColorSequence.new(style.BackgroundColor3) + end + else + return ColorSequence.new(Color3.new(1,1,1)) + end + end, useRippleState, currentStyleState, rippleColorState), + }), _new("UIStroke")({ ApplyStrokeMode = Enum.ApplyStrokeMode.Border, Color = _Computed(function(style: TextStyle): Color3 diff --git a/src/Component/Button/ElevatedButton/init.luau b/src/Component/Button/ElevatedButton/init.luau index e5c5b201..5a7014da 100644 --- a/src/Component/Button/ElevatedButton/init.luau +++ b/src/Component/Button/ElevatedButton/init.luau @@ -175,7 +175,11 @@ function Interface.cfusion( _Computed(function(t: ThemeData): number return t.Scale end, themeState), - sound + sound, + nil, + nil, + nil, + true ) maid.bind(button) return button diff --git a/src/Component/Button/ExtendedFAB/init.luau b/src/Component/Button/ExtendedFAB/init.luau index 654f8b4b..f95acaa2 100644 --- a/src/Component/Button/ExtendedFAB/init.luau +++ b/src/Component/Button/ExtendedFAB/init.luau @@ -177,7 +177,9 @@ function Interface.cfusion( end, themeState), sound, false, - SHAPE_DP + SHAPE_DP, + nil, + true ) maid.bind(button) return button diff --git a/src/Component/Button/FAB/init.luau b/src/Component/Button/FAB/init.luau index a378f6f5..558de6bc 100644 --- a/src/Component/Button/FAB/init.luau +++ b/src/Component/Button/FAB/init.luau @@ -175,7 +175,9 @@ function Interface.cfusion( end, themeState), sound, false, - SHAPE_DP + SHAPE_DP, + nil, + true ) maid.bind(button) return button diff --git a/src/Component/Button/FilledButton/init.luau b/src/Component/Button/FilledButton/init.luau index 76ef2157..612e7e80 100644 --- a/src/Component/Button/FilledButton/init.luau +++ b/src/Component/Button/FilledButton/init.luau @@ -175,7 +175,11 @@ function Interface.cfusion( _Computed(function(t: ThemeData): number return t.Scale end, themeState), - sound + sound, + nil, + nil, + nil, + true ) maid.bind(button) return button diff --git a/src/Component/Button/FilledIconButton/init.luau b/src/Component/Button/FilledIconButton/init.luau index 0eadeb6a..28ed322c 100644 --- a/src/Component/Button/FilledIconButton/init.luau +++ b/src/Component/Button/FilledIconButton/init.luau @@ -176,7 +176,8 @@ function Interface.cfusion( sound, false, nil, - 0.75 + 0.75, + true ) maid.bind(button) return button diff --git a/synthetic.rbxl.lock b/synthetic.rbxl.lock index e383dff5..e163dd24 100644 --- a/synthetic.rbxl.lock +++ b/synthetic.rbxl.lock @@ -1,4 +1,4 @@ -10340 +31672 RobloxStudioBeta DESKTOP-UIAPQFM faf3918c-cd67-4e9b-95e8-76107b83bc31 From e06ccf6cf3c4276462a3c4ed0e86a22e50a2fef0 Mon Sep 17 00:00:00 2001 From: Nightcycle <77173389+nightcycle@users.noreply.github.com> Date: Wed, 6 Dec 2023 11:37:42 -0500 Subject: [PATCH 11/57] Ran StyLua --- src/Component/Button/Base.luau | 90 +++++++--------- .../Button/ElevatedButton/cfusion.story.luau | 81 ++++---------- src/Component/Button/ElevatedButton/init.luau | 89 +++------------- .../Button/ExtendedFAB/cfusion.story.luau | 81 ++++---------- src/Component/Button/ExtendedFAB/init.luau | 89 +++------------- src/Component/Button/FAB/cfusion.story.luau | 69 ++++-------- src/Component/Button/FAB/init.luau | 90 ++++------------ .../Button/FilledButton/cfusion.story.luau | 81 ++++---------- src/Component/Button/FilledButton/init.luau | 89 +++------------- .../FilledIconButton/cfusion.story.luau | 69 ++++-------- .../Button/FilledIconButton/init.luau | 90 ++++------------ .../Button/IconButton/cfusion.story.luau | 69 ++++-------- src/Component/Button/IconButton/init.luau | 92 ++++------------ .../Button/OutlinedButton/cfusion.story.luau | 81 ++++---------- src/Component/Button/OutlinedButton/init.luau | 99 ++++------------- .../OutlinedIconButton/cfusion.story.luau | 69 ++++-------- .../Button/OutlinedIconButton/init.luau | 100 ++++-------------- .../Button/TextButton/cfusion.story.luau | 81 ++++---------- src/Component/Button/TextButton/init.luau | 93 ++++------------ src/Config.luau | 6 +- src/Enums.luau | 6 +- src/Sounds.luau | 4 +- src/Types.luau | 45 ++------ src/Util.luau | 61 ++++------- src/init.luau | 2 +- 25 files changed, 415 insertions(+), 1311 deletions(-) diff --git a/src/Component/Button/Base.luau b/src/Component/Button/Base.luau index 6d190f22..c58f2195 100644 --- a/src/Component/Button/Base.luau +++ b/src/Component/Button/Base.luau @@ -1,4 +1,3 @@ - --!strict local _Package = script.Parent.Parent.Parent local _Packages = _Package.Parent @@ -35,13 +34,13 @@ local PADDING_BETWEEN_ELEMENTS_DP = 8 local LABEL_TEXT_ALIGNMENT = Enum.TextXAlignment.Center local IMAGE_SIZE = 500 local RIP_STEP = 0.005 -local HALF_IMAGE_SIZE = IMAGE_SIZE/2 -return function ( +local HALF_IMAGE_SIZE = IMAGE_SIZE / 2 +return function( maid: Maid, onClick: CanBeState<() -> ()>, - text: CanBeState, + text: CanBeState, font: CanBeState, - styles: CanBeState<{[Enums.ButtonStateType]: TextStyle}>, + styles: CanBeState<{ [Enums.ButtonStateType]: TextStyle }>, textIcon: CanBeState, isEnabled: CanBeState, isDropShadow: CanBeState, @@ -52,14 +51,13 @@ return function ( paddingScale: CanBeState?, useRipple: CanBeState? ): ImageLabel - local _fuse = ColdFusion.fuse(maid) - + local _new = _fuse.new local _bind = _fuse.bind local _clone = _fuse.clone local _import = _fuse.import - + local _Value = _fuse.Value local _Computed = _fuse.Computed local isEnabledState = _import(isEnabled, true) @@ -87,7 +85,7 @@ return function ( end, isEnabledState, isFocusedState, isPressedState, isHoveredState) :: State local stylesState = _import(styles, {}) :: any - local currentStyleState = _Computed(function(state: Enums.ButtonStateType, styles: {[Enums.ButtonStateType]: TextStyle}): TextStyle + local currentStyleState = _Computed(function(state: Enums.ButtonStateType, styles: { [Enums.ButtonStateType]: TextStyle }): TextStyle local style = styles[state] assert(style ~= nil, `no style for {state}`) return style @@ -114,34 +112,26 @@ return function ( local alpha = 0 local xStart = inst.AbsolutePosition.X - local initialAlpha = math.clamp((clickPosition.X - xStart)/inst.AbsoluteSize.X, 0, 1) + local initialAlpha = math.clamp((clickPosition.X - xStart) / inst.AbsoluteSize.X, 0, 1) runMaid:GiveTask(RunService.RenderStepped:Connect(function(deltaTime: number) alpha += deltaTime / 0.6 - local moveAlpha = 1-CurveUtil.ease( - 1-math.clamp(alpha/0.5, 0, 1), - Enum.EasingStyle.Quad, - Enum.EasingDirection.In - ) - local fadeAlpha = CurveUtil.ease( - math.clamp((alpha-0.1)/0.7, 0, 1), - Enum.EasingStyle.Quad, - Enum.EasingDirection.In - ) + local moveAlpha = 1 - CurveUtil.ease(1 - math.clamp(alpha / 0.5, 0, 1), Enum.EasingStyle.Quad, Enum.EasingDirection.In) + local fadeAlpha = CurveUtil.ease(math.clamp((alpha - 0.1) / 0.7, 0, 1), Enum.EasingStyle.Quad, Enum.EasingDirection.In) local baseColor = (stylesState:Get()[Enums.ButtonStateType.Enabled] :: TextStyle).BackgroundColor3 - local rippleColor = (Color3.new(1,1,1):Lerp(baseColor, 0.8)):Lerp(baseColor, fadeAlpha) + local rippleColor = (Color3.new(1, 1, 1):Lerp(baseColor, 0.8)):Lerp(baseColor, fadeAlpha) - local leftOffset = math.clamp(initialAlpha - moveAlpha, RIP_STEP, math.max(initialAlpha-RIP_STEP, RIP_STEP*1.5)) - local rightOffset = math.clamp(initialAlpha + moveAlpha, math.min(initialAlpha+RIP_STEP, 1-RIP_STEP*1.5), 1-RIP_STEP) + local leftOffset = math.clamp(initialAlpha - moveAlpha, RIP_STEP, math.max(initialAlpha - RIP_STEP, RIP_STEP * 1.5)) + local rightOffset = math.clamp(initialAlpha + moveAlpha, math.min(initialAlpha + RIP_STEP, 1 - RIP_STEP * 1.5), 1 - RIP_STEP) rippleColorState:Set(ColorSequence.new({ ColorSequenceKeypoint.new(0, baseColor), - ColorSequenceKeypoint.new(leftOffset-RIP_STEP*0.5, baseColor), + ColorSequenceKeypoint.new(leftOffset - RIP_STEP * 0.5, baseColor), ColorSequenceKeypoint.new(leftOffset, rippleColor), ColorSequenceKeypoint.new(rightOffset, rippleColor), - ColorSequenceKeypoint.new(rightOffset+RIP_STEP*0.5, baseColor), + ColorSequenceKeypoint.new(rightOffset + RIP_STEP * 0.5, baseColor), ColorSequenceKeypoint.new(1, baseColor), })) @@ -153,10 +143,9 @@ return function ( maid._ripple = runMaid end - inst = _new("ImageLabel")({ Image = "rbxassetid://15549395120", - ImageColor3 = Color3.new(0,0,0), + ImageColor3 = Color3.new(0, 0, 0), BackgroundTransparency = 1, ImageTransparency = _Computed(function(style: TextStyle, isDrop: boolean): number return if style.BackgroundTransparency == 0 and isDrop then 0 else 1 @@ -167,7 +156,7 @@ return function ( SliceScale = 1, Children = { _new("UIListLayout")({ - Padding = UDim.new(0,0), + Padding = UDim.new(0, 0), SortOrder = Enum.SortOrder.LayoutOrder, FillDirection = Enum.FillDirection.Horizontal, ItemLineAlignment = Enum.ItemLineAlignment.Center, @@ -176,7 +165,7 @@ return function ( }), _new("UIPadding")({ PaddingBottom = _Computed(function(s: number, isDrop: boolean): UDim - return if isDrop then UDim.new(0, s * 5) else UDim.new(0,0) + return if isDrop then UDim.new(0, s * 5) else UDim.new(0, 0) end, scaleState, isDropShadowState), }), _new("TextButton")({ @@ -186,7 +175,9 @@ return function ( return style.BackgroundTransparency end, currentStyleState), BackgroundColor3 = _Computed(function(style: TextStyle, useRip: boolean): Color3 - if useRip then return Color3.new(1,1,1) end + if useRip then + return Color3.new(1, 1, 1) + end return style.BackgroundColor3 end, currentStyleState, useRippleState), Active = isEnabledState, @@ -196,7 +187,9 @@ return function ( end, scaleState), Events = { Activated = function() - if isEnabledState:Get() == false then return end + if isEnabledState:Get() == false then + return + end local click = onClickState:Get() local s = soundState:Get() if s then @@ -205,18 +198,17 @@ return function ( click() end, MouseButton1Down = function(x: number, y: number) - if isEnabledState:Get() == false then return end + if isEnabledState:Get() == false then + return + end isPressedState:Set(true) end, MouseButton1Up = function(x: number, y: number) - if isEnabledState:Get() == false then return end + if isEnabledState:Get() == false then + return + end if useRippleState:Get() then - ripple( - Vector2.new( - x, - y - ) - ) + ripple(Vector2.new(x, y)) end isPressedState:Set(false) end, @@ -248,7 +240,7 @@ return function ( return ColorSequence.new(style.BackgroundColor3) end else - return ColorSequence.new(Color3.new(1,1,1)) + return ColorSequence.new(Color3.new(1, 1, 1)) end end, useRippleState, currentStyleState, rippleColorState), }), @@ -259,7 +251,7 @@ return function ( end, currentStyleState), LineJoinMode = Enum.LineJoinMode.Round, Thickness = _Computed(function(s: number): number - return math.max(s*1, 1) + return math.max(s * 1, 1) end, scaleState), Transparency = _Computed(function(style: TextStyle): number return style.BorderTransparency @@ -308,7 +300,7 @@ return function ( return if icon then icon.Image else "" end, iconState), ImageColor3 = _Computed(function(icon: ImageData?, style: TextStyle?): Color3 - return if icon and style then style.TextColor3 else Color3.new(1,1,1) + return if icon and style then style.TextColor3 else Color3.new(1, 1, 1) end, iconState, currentStyleState), ImageRectOffset = _Computed(function(icon: ImageData?): Vector2 return if icon then icon.RectOffset else Vector2.zero @@ -321,7 +313,7 @@ return function ( end, iconState, currentStyleState), SizeConstraint = Enum.SizeConstraint.RelativeYY, Size = _Computed(function(s: number): UDim2 - return UDim2.fromScale(1,1) + return UDim2.fromScale(1, 1) -- return UDim2.fromOffset(s * ICON_SIZE_DP, s * ICON_SIZE_DP) end, scaleState), }), @@ -331,7 +323,7 @@ return function ( if txt:len() > 0 then return UDim.new(0, padScale * LEFT_PADDING_WITH_ICON_DP * s) else - return UDim.new(0, padScale * s * (HEIGHT_DP-ICON_SIZE_DP) / 2) + return UDim.new(0, padScale * s * (HEIGHT_DP - ICON_SIZE_DP) / 2) end else return UDim.new(0, padScale * LEFT_RIGHT_PADDING_DP * s) @@ -342,17 +334,17 @@ return function ( if txt:len() > 0 then return UDim.new(0, padScale * RIGHT_PADDING_WITH_ICON_DP * s) else - return UDim.new(0, padScale * s * (HEIGHT_DP-ICON_SIZE_DP) / 2) + return UDim.new(0, padScale * s * (HEIGHT_DP - ICON_SIZE_DP) / 2) end else return UDim.new(0, padScale * LEFT_RIGHT_PADDING_DP * s) end end, scaleState, iconState, textState, paddingScaleState), PaddingTop = _Computed(function(s: number, padScale: number): UDim - return UDim.new(0, padScale * s * (HEIGHT_DP-ICON_SIZE_DP) / 2) + return UDim.new(0, padScale * s * (HEIGHT_DP - ICON_SIZE_DP) / 2) end, scaleState, paddingScaleState), PaddingBottom = _Computed(function(s: number, padScale: number): UDim - return UDim.new(0, padScale * s * (HEIGHT_DP-ICON_SIZE_DP) / 2) + return UDim.new(0, padScale * s * (HEIGHT_DP - ICON_SIZE_DP) / 2) end, scaleState, paddingScaleState), }), _new("UISizeConstraint")({ @@ -366,9 +358,9 @@ return function ( end, scaleState, hasMinState), }), }, - }) :: TextButton + }) :: TextButton, }, }) :: ImageLabel return inst -end \ No newline at end of file +end diff --git a/src/Component/Button/ElevatedButton/cfusion.story.luau b/src/Component/Button/ElevatedButton/cfusion.story.luau index d4906360..36321802 100644 --- a/src/Component/Button/ElevatedButton/cfusion.story.luau +++ b/src/Component/Button/ElevatedButton/cfusion.story.luau @@ -19,13 +19,9 @@ local Icons = MaterialIcons.default.dp_48.scale_1 return function(frame: Frame) local maid = Maid.new() task.spawn(function() - local function makeHalfFrame( - isDarkMode: boolean, - color: Color3 - ): Frame - + local function makeHalfFrame(isDarkMode: boolean, color: Color3): Frame local halfFrame = maid:GiveTask(Instance.new("Frame")) - halfFrame.BackgroundColor3 = if isDarkMode then Color3.new(0.15,0.15,0.15) else Color3.new(0.85, 0.85, 0.85) + halfFrame.BackgroundColor3 = if isDarkMode then Color3.new(0.15, 0.15, 0.15) else Color3.new(0.85, 0.85, 0.85) local listLayout = maid:GiveTask(Instance.new("UIListLayout")) listLayout.FillDirection = Enum.FillDirection.Vertical @@ -35,62 +31,33 @@ return function(frame: Frame) listLayout.Parent = halfFrame local Module = require(script.Parent) - local theme = Types.newThemeData( - 1, - isDarkMode, - SCALE, - Font.fromEnum(Enum.Font.SourceSans), - color, - halfFrame.BackgroundColor3 - ) + local theme = Types.newThemeData(1, isDarkMode, SCALE, Font.fromEnum(Enum.Font.SourceSans), color, halfFrame.BackgroundColor3) do - local button = maid:GiveTask(Module.cfusion( - function() - print("click") - end, - "Button", - theme, - nil, - nil - )) + local button = maid:GiveTask(Module.cfusion(function() + print("click") + end, "Button", theme, nil, nil)) button.Parent = halfFrame end do - local button = maid:GiveTask(Module.cfusion( - function() - print("click") - end, - "Disabled", - theme, - nil, - false - )) + local button = maid:GiveTask(Module.cfusion(function() + print("click") + end, "Disabled", theme, nil, false)) button.Parent = halfFrame end do - local button = maid:GiveTask(Module.cfusion( - function() - print("click") - end, - "Icon", - theme, - Types.newImageData( - Icons.voice_chat.Image, - Icons.voice_chat.ImageRectOffset, - Icons.voice_chat.ImageRectSize - ), - true - )) + local button = maid:GiveTask(Module.cfusion(function() + print("click") + end, "Icon", theme, Types.newImageData(Icons.voice_chat.Image, Icons.voice_chat.ImageRectOffset, Icons.voice_chat.ImageRectSize), true)) button.Parent = halfFrame end return halfFrame end - local COLORS: {[number]: Color3} = { + local COLORS: { [number]: Color3 } = { Color3.fromHSV(0, 0.9, 0.8), Color3.fromHSV(0, 0.25, 0.8), Color3.fromHSV(0, 0.9, 0.5), @@ -100,29 +67,21 @@ return function(frame: Frame) } for i, color in ipairs(COLORS) do - local x = (i-1)/(#COLORS) - local width = 1/(#COLORS) - local dark = makeHalfFrame( - true, - color - ) - + local x = (i - 1) / #COLORS + local width = 1 / #COLORS + local dark = makeHalfFrame(true, color) + dark.Size = UDim2.fromScale(width, 0.5) dark.Position = UDim2.fromScale(x, 0.5) dark.Parent = frame - - local bright = makeHalfFrame( - false, - color - ) + + local bright = makeHalfFrame(false, color) bright.Size = UDim2.fromScale(width, 0.5) bright.Position = UDim2.fromScale(x, 0) bright.Parent = frame - end - end) return function() maid:Destroy() end -end \ No newline at end of file +end diff --git a/src/Component/Button/ElevatedButton/init.luau b/src/Component/Button/ElevatedButton/init.luau index 5a7014da..aed1c0fd 100644 --- a/src/Component/Button/ElevatedButton/init.luau +++ b/src/Component/Button/ElevatedButton/init.luau @@ -32,60 +32,41 @@ local DISABLE_BACK_TRANS = Config.Transparency.Background.Disabled -- References -- Private Functions - -- Class local Interface = {} -function Interface.cfusion( - onClick: CanBeState<() -> ()>, - text: CanBeState, - theme: CanBeState, - icon: CanBeState?, - isEnabled: CanBeState? -): ImageLabel +function Interface.cfusion(onClick: CanBeState<() -> ()>, text: CanBeState, theme: CanBeState, icon: CanBeState?, isEnabled: CanBeState?): ImageLabel local maid = Maid.new() local _fuse = ColdFusion.fuse(maid) - + local _new = _fuse.new local _bind = _fuse.bind local _clone = _fuse.clone local _import = _fuse.import - + local _Value = _fuse.Value local _Computed = _fuse.Computed local onClickState = _import(onClick, function() end) local textState = _import(text, "") - local themeState = _import(theme, Types.newThemeData( - 1, - false, - 1, - Font.fromEnum(Enum.Font.SourceSansSemibold), - Color3.fromHSV(0.8, 0.4, 0.8) - )) + local themeState = _import(theme, Types.newThemeData(1, false, 1, Font.fromEnum(Enum.Font.SourceSansSemibold), Color3.fromHSV(0.8, 0.4, 0.8))) local sound = maid:GiveTask(Instance.new("Sound")) sound.Volume = DEFAULT_VOLUME sound.SoundId = Sounds.ui_tap_variant_01 - local styles = _Computed(function(thm: ThemeData): {[Enums.ButtonStateType]: TextStyle} + local styles = _Computed(function(thm: ThemeData): { [Enums.ButtonStateType]: TextStyle } local backColor: Color3? local textColor: Color3? if thm.IsDarkMode then - backColor = Util.getReadableColor( - thm.Color3, - if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.DARK_SURFACE - ) + backColor = Util.getReadableColor(thm.Color3, if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.DARK_SURFACE) assert(backColor) textColor = Util.DARK_SURFACE else - backColor = Util.getReadableColor( - thm.Color3, - if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.LIGHT_SURFACE - ) + backColor = Util.getReadableColor(thm.Color3, if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.LIGHT_SURFACE) assert(backColor) textColor = Util.LIGHT_SURFACE @@ -93,32 +74,17 @@ function Interface.cfusion( assert(backColor) assert(textColor) - backColor = Util.getElevatedColor( - backColor, - thm.Elevation, - thm.IsDarkMode - ) + backColor = Util.getElevatedColor(backColor, thm.Elevation, thm.IsDarkMode) - textColor = Util.getElevatedColor( - textColor, - thm.Elevation, - thm.IsDarkMode - ) + textColor = Util.getElevatedColor(textColor, thm.Elevation, thm.IsDarkMode) local disableBackColor = (function(): Color3 - local h,s,v = backColor:ToHSV() - return Color3.fromHSV(h,s*0,v) + local h, s, v = backColor:ToHSV() + return Color3.fromHSV(h, s * 0, v) end)() local data = { - [Enums.ButtonStateType.Enabled] = Types.newTextStyle( - textColor, - 0, - backColor, - 0, - textColor, - 1 - ), + [Enums.ButtonStateType.Enabled] = Types.newTextStyle(textColor, 0, backColor, 0, textColor, 1), [Enums.ButtonStateType.Disabled] = Types.newTextStyle( (function(): Color3 if thm.IsDarkMode then @@ -133,30 +99,9 @@ function Interface.cfusion( textColor, 1 ), - [Enums.ButtonStateType.Focused] = Types.newTextStyle( - textColor, - 0, - backColor, - 0, - textColor, - 1 - ), - [Enums.ButtonStateType.Hovered] = Types.newTextStyle( - textColor, - 0, - backColor, - 0, - textColor, - 1 - ), - [Enums.ButtonStateType.Pressed] = Types.newTextStyle( - textColor, - 0, - backColor, - 0, - textColor, - 1 - ), + [Enums.ButtonStateType.Focused] = Types.newTextStyle(textColor, 0, backColor, 0, textColor, 1), + [Enums.ButtonStateType.Hovered] = Types.newTextStyle(textColor, 0, backColor, 0, textColor, 1), + [Enums.ButtonStateType.Pressed] = Types.newTextStyle(textColor, 0, backColor, 0, textColor, 1), } return data end, themeState) @@ -164,7 +109,7 @@ function Interface.cfusion( local button = Base( maid, onClickState, - textState, + textState, _Computed(function(t: ThemeData): Font return t.Font end, themeState), @@ -185,4 +130,4 @@ function Interface.cfusion( return button end -return Interface \ No newline at end of file +return Interface diff --git a/src/Component/Button/ExtendedFAB/cfusion.story.luau b/src/Component/Button/ExtendedFAB/cfusion.story.luau index d4906360..36321802 100644 --- a/src/Component/Button/ExtendedFAB/cfusion.story.luau +++ b/src/Component/Button/ExtendedFAB/cfusion.story.luau @@ -19,13 +19,9 @@ local Icons = MaterialIcons.default.dp_48.scale_1 return function(frame: Frame) local maid = Maid.new() task.spawn(function() - local function makeHalfFrame( - isDarkMode: boolean, - color: Color3 - ): Frame - + local function makeHalfFrame(isDarkMode: boolean, color: Color3): Frame local halfFrame = maid:GiveTask(Instance.new("Frame")) - halfFrame.BackgroundColor3 = if isDarkMode then Color3.new(0.15,0.15,0.15) else Color3.new(0.85, 0.85, 0.85) + halfFrame.BackgroundColor3 = if isDarkMode then Color3.new(0.15, 0.15, 0.15) else Color3.new(0.85, 0.85, 0.85) local listLayout = maid:GiveTask(Instance.new("UIListLayout")) listLayout.FillDirection = Enum.FillDirection.Vertical @@ -35,62 +31,33 @@ return function(frame: Frame) listLayout.Parent = halfFrame local Module = require(script.Parent) - local theme = Types.newThemeData( - 1, - isDarkMode, - SCALE, - Font.fromEnum(Enum.Font.SourceSans), - color, - halfFrame.BackgroundColor3 - ) + local theme = Types.newThemeData(1, isDarkMode, SCALE, Font.fromEnum(Enum.Font.SourceSans), color, halfFrame.BackgroundColor3) do - local button = maid:GiveTask(Module.cfusion( - function() - print("click") - end, - "Button", - theme, - nil, - nil - )) + local button = maid:GiveTask(Module.cfusion(function() + print("click") + end, "Button", theme, nil, nil)) button.Parent = halfFrame end do - local button = maid:GiveTask(Module.cfusion( - function() - print("click") - end, - "Disabled", - theme, - nil, - false - )) + local button = maid:GiveTask(Module.cfusion(function() + print("click") + end, "Disabled", theme, nil, false)) button.Parent = halfFrame end do - local button = maid:GiveTask(Module.cfusion( - function() - print("click") - end, - "Icon", - theme, - Types.newImageData( - Icons.voice_chat.Image, - Icons.voice_chat.ImageRectOffset, - Icons.voice_chat.ImageRectSize - ), - true - )) + local button = maid:GiveTask(Module.cfusion(function() + print("click") + end, "Icon", theme, Types.newImageData(Icons.voice_chat.Image, Icons.voice_chat.ImageRectOffset, Icons.voice_chat.ImageRectSize), true)) button.Parent = halfFrame end return halfFrame end - local COLORS: {[number]: Color3} = { + local COLORS: { [number]: Color3 } = { Color3.fromHSV(0, 0.9, 0.8), Color3.fromHSV(0, 0.25, 0.8), Color3.fromHSV(0, 0.9, 0.5), @@ -100,29 +67,21 @@ return function(frame: Frame) } for i, color in ipairs(COLORS) do - local x = (i-1)/(#COLORS) - local width = 1/(#COLORS) - local dark = makeHalfFrame( - true, - color - ) - + local x = (i - 1) / #COLORS + local width = 1 / #COLORS + local dark = makeHalfFrame(true, color) + dark.Size = UDim2.fromScale(width, 0.5) dark.Position = UDim2.fromScale(x, 0.5) dark.Parent = frame - - local bright = makeHalfFrame( - false, - color - ) + + local bright = makeHalfFrame(false, color) bright.Size = UDim2.fromScale(width, 0.5) bright.Position = UDim2.fromScale(x, 0) bright.Parent = frame - end - end) return function() maid:Destroy() end -end \ No newline at end of file +end diff --git a/src/Component/Button/ExtendedFAB/init.luau b/src/Component/Button/ExtendedFAB/init.luau index f95acaa2..62e8f3d7 100644 --- a/src/Component/Button/ExtendedFAB/init.luau +++ b/src/Component/Button/ExtendedFAB/init.luau @@ -32,60 +32,41 @@ local SHAPE_DP = 20 * 0.5 -- References -- Private Functions - -- Class local Interface = {} -function Interface.cfusion( - onClick: CanBeState<() -> ()>, - text: CanBeState, - theme: CanBeState, - icon: CanBeState?, - isEnabled: CanBeState? -): ImageLabel +function Interface.cfusion(onClick: CanBeState<() -> ()>, text: CanBeState, theme: CanBeState, icon: CanBeState?, isEnabled: CanBeState?): ImageLabel local maid = Maid.new() local _fuse = ColdFusion.fuse(maid) - + local _new = _fuse.new local _bind = _fuse.bind local _clone = _fuse.clone local _import = _fuse.import - + local _Value = _fuse.Value local _Computed = _fuse.Computed local onClickState = _import(onClick, function() end) local textState = _import(text, "") - local themeState = _import(theme, Types.newThemeData( - 1, - false, - 1, - Font.fromEnum(Enum.Font.SourceSansSemibold), - Color3.fromHSV(0.8, 0.4, 0.8) - )) + local themeState = _import(theme, Types.newThemeData(1, false, 1, Font.fromEnum(Enum.Font.SourceSansSemibold), Color3.fromHSV(0.8, 0.4, 0.8))) local sound = maid:GiveTask(Instance.new("Sound")) sound.Volume = DEFAULT_VOLUME sound.SoundId = Sounds.ui_tap_variant_01 - local styles = _Computed(function(thm: ThemeData): {[Enums.ButtonStateType]: TextStyle} + local styles = _Computed(function(thm: ThemeData): { [Enums.ButtonStateType]: TextStyle } local backColor: Color3? local textColor: Color3? if thm.IsDarkMode then - backColor = Util.getReadableColor( - thm.Color3, - if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.DARK_SURFACE - ) + backColor = Util.getReadableColor(thm.Color3, if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.DARK_SURFACE) assert(backColor) textColor = Util.DARK_SURFACE else - backColor = Util.getReadableColor( - thm.Color3, - if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.LIGHT_SURFACE - ) + backColor = Util.getReadableColor(thm.Color3, if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.LIGHT_SURFACE) assert(backColor) textColor = Util.LIGHT_SURFACE @@ -93,32 +74,17 @@ function Interface.cfusion( assert(backColor) assert(textColor) - backColor = Util.getElevatedColor( - backColor, - thm.Elevation, - thm.IsDarkMode - ) + backColor = Util.getElevatedColor(backColor, thm.Elevation, thm.IsDarkMode) - textColor = Util.getElevatedColor( - textColor, - thm.Elevation, - thm.IsDarkMode - ) + textColor = Util.getElevatedColor(textColor, thm.Elevation, thm.IsDarkMode) local disableBackColor = (function(): Color3 - local h,s,v = backColor:ToHSV() - return Color3.fromHSV(h,s*0,v) + local h, s, v = backColor:ToHSV() + return Color3.fromHSV(h, s * 0, v) end)() local data = { - [Enums.ButtonStateType.Enabled] = Types.newTextStyle( - textColor, - 0, - backColor, - 0, - textColor, - 1 - ), + [Enums.ButtonStateType.Enabled] = Types.newTextStyle(textColor, 0, backColor, 0, textColor, 1), [Enums.ButtonStateType.Disabled] = Types.newTextStyle( (function(): Color3 if thm.IsDarkMode then @@ -133,30 +99,9 @@ function Interface.cfusion( textColor, 1 ), - [Enums.ButtonStateType.Focused] = Types.newTextStyle( - textColor, - 0, - backColor, - 0, - textColor, - 1 - ), - [Enums.ButtonStateType.Hovered] = Types.newTextStyle( - textColor, - 0, - backColor, - 0, - textColor, - 1 - ), - [Enums.ButtonStateType.Pressed] = Types.newTextStyle( - textColor, - 0, - backColor, - 0, - textColor, - 1 - ), + [Enums.ButtonStateType.Focused] = Types.newTextStyle(textColor, 0, backColor, 0, textColor, 1), + [Enums.ButtonStateType.Hovered] = Types.newTextStyle(textColor, 0, backColor, 0, textColor, 1), + [Enums.ButtonStateType.Pressed] = Types.newTextStyle(textColor, 0, backColor, 0, textColor, 1), } return data end, themeState) @@ -164,7 +109,7 @@ function Interface.cfusion( local button = Base( maid, onClickState, - textState, + textState, _Computed(function(t: ThemeData): Font return t.Font end, themeState), @@ -185,4 +130,4 @@ function Interface.cfusion( return button end -return Interface \ No newline at end of file +return Interface diff --git a/src/Component/Button/FAB/cfusion.story.luau b/src/Component/Button/FAB/cfusion.story.luau index 3827ddb3..559b26ba 100644 --- a/src/Component/Button/FAB/cfusion.story.luau +++ b/src/Component/Button/FAB/cfusion.story.luau @@ -19,13 +19,9 @@ local Icons = MaterialIcons.default.dp_48.scale_1 return function(frame: Frame) local maid = Maid.new() task.spawn(function() - local function makeHalfFrame( - isDarkMode: boolean, - color: Color3 - ): Frame - + local function makeHalfFrame(isDarkMode: boolean, color: Color3): Frame local halfFrame = maid:GiveTask(Instance.new("Frame")) - halfFrame.BackgroundColor3 = if isDarkMode then Color3.new(0.15,0.15,0.15) else Color3.new(0.85, 0.85, 0.85) + halfFrame.BackgroundColor3 = if isDarkMode then Color3.new(0.15, 0.15, 0.15) else Color3.new(0.85, 0.85, 0.85) local listLayout = maid:GiveTask(Instance.new("UIListLayout")) listLayout.FillDirection = Enum.FillDirection.Vertical @@ -34,50 +30,29 @@ return function(frame: Frame) listLayout.HorizontalAlignment = Enum.HorizontalAlignment.Center listLayout.Parent = halfFrame - local img = Types.newImageData( - Icons.voice_chat.Image, - Icons.voice_chat.ImageRectOffset, - Icons.voice_chat.ImageRectSize - ) + local img = Types.newImageData(Icons.voice_chat.Image, Icons.voice_chat.ImageRectOffset, Icons.voice_chat.ImageRectSize) local Module = require(script.Parent) - local theme = Types.newThemeData( - 1, - isDarkMode, - SCALE, - Font.fromEnum(Enum.Font.SourceSans), - color, - halfFrame.BackgroundColor3 - ) + local theme = Types.newThemeData(1, isDarkMode, SCALE, Font.fromEnum(Enum.Font.SourceSans), color, halfFrame.BackgroundColor3) do - local button = maid:GiveTask(Module.cfusion( - function() - print("click") - end, - img, - theme, - nil - )) + local button = maid:GiveTask(Module.cfusion(function() + print("click") + end, img, theme, nil)) button.Parent = halfFrame end do - local button = maid:GiveTask(Module.cfusion( - function() - print("click") - end, - img, - theme, - false - )) + local button = maid:GiveTask(Module.cfusion(function() + print("click") + end, img, theme, false)) button.Parent = halfFrame end return halfFrame end - local COLORS: {[number]: Color3} = { + local COLORS: { [number]: Color3 } = { Color3.fromHSV(0, 0.9, 0.8), Color3.fromHSV(0, 0.25, 0.8), Color3.fromHSV(0, 0.9, 0.5), @@ -87,29 +62,21 @@ return function(frame: Frame) } for i, color in ipairs(COLORS) do - local x = (i-1)/(#COLORS) - local width = 1/(#COLORS) - local dark = makeHalfFrame( - true, - color - ) - + local x = (i - 1) / #COLORS + local width = 1 / #COLORS + local dark = makeHalfFrame(true, color) + dark.Size = UDim2.fromScale(width, 0.5) dark.Position = UDim2.fromScale(x, 0.5) dark.Parent = frame - - local bright = makeHalfFrame( - false, - color - ) + + local bright = makeHalfFrame(false, color) bright.Size = UDim2.fromScale(width, 0.5) bright.Position = UDim2.fromScale(x, 0) bright.Parent = frame - end - end) return function() maid:Destroy() end -end \ No newline at end of file +end diff --git a/src/Component/Button/FAB/init.luau b/src/Component/Button/FAB/init.luau index 558de6bc..22c26cda 100644 --- a/src/Component/Button/FAB/init.luau +++ b/src/Component/Button/FAB/init.luau @@ -27,63 +27,45 @@ type ThemeData = Types.ThemeData local DEFAULT_VOLUME = Config.Sound.Volume local DISABLE_TRANSPARENCY = Config.Transparency.Text.Disabled local DISABLE_BACK_TRANS = Config.Transparency.Background.Disabled -local SHAPE_DP = 20*0.5 +local SHAPE_DP = 20 * 0.5 -- Variables -- References -- Private Functions - -- Class local Interface = {} -function Interface.cfusion( - onClick: CanBeState<() -> ()>, - icon: CanBeState, - theme: CanBeState, - isEnabled: CanBeState? -): ImageLabel +function Interface.cfusion(onClick: CanBeState<() -> ()>, icon: CanBeState, theme: CanBeState, isEnabled: CanBeState?): ImageLabel local maid = Maid.new() local _fuse = ColdFusion.fuse(maid) - + local _new = _fuse.new local _bind = _fuse.bind local _clone = _fuse.clone local _import = _fuse.import - + local _Value = _fuse.Value local _Computed = _fuse.Computed local onClickState = _import(onClick, function() end) - local themeState = _import(theme, Types.newThemeData( - 1, - false, - 1, - Font.fromEnum(Enum.Font.SourceSansSemibold), - Color3.fromHSV(0.8, 0.4, 0.8) - )) + local themeState = _import(theme, Types.newThemeData(1, false, 1, Font.fromEnum(Enum.Font.SourceSansSemibold), Color3.fromHSV(0.8, 0.4, 0.8))) local sound = maid:GiveTask(Instance.new("Sound")) sound.Volume = DEFAULT_VOLUME sound.SoundId = Sounds.ui_tap_variant_01 - local styles = _Computed(function(thm: ThemeData): {[Enums.ButtonStateType]: TextStyle} + local styles = _Computed(function(thm: ThemeData): { [Enums.ButtonStateType]: TextStyle } local backColor: Color3? local textColor: Color3? if thm.IsDarkMode then - backColor = Util.getReadableColor( - thm.Color3, - if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.DARK_SURFACE - ) + backColor = Util.getReadableColor(thm.Color3, if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.DARK_SURFACE) assert(backColor) textColor = Util.DARK_SURFACE else - backColor = Util.getReadableColor( - thm.Color3, - if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.LIGHT_SURFACE - ) + backColor = Util.getReadableColor(thm.Color3, if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.LIGHT_SURFACE) assert(backColor) textColor = Util.LIGHT_SURFACE @@ -91,32 +73,17 @@ function Interface.cfusion( assert(backColor) assert(textColor) - backColor = Util.getElevatedColor( - backColor, - thm.Elevation, - thm.IsDarkMode - ) + backColor = Util.getElevatedColor(backColor, thm.Elevation, thm.IsDarkMode) - textColor = Util.getElevatedColor( - textColor, - thm.Elevation, - thm.IsDarkMode - ) + textColor = Util.getElevatedColor(textColor, thm.Elevation, thm.IsDarkMode) local disableBackColor = (function(): Color3 - local h,s,v = backColor:ToHSV() - return Color3.fromHSV(h,s*0,v) + local h, s, v = backColor:ToHSV() + return Color3.fromHSV(h, s * 0, v) end)() local data = { - [Enums.ButtonStateType.Enabled] = Types.newTextStyle( - textColor, - 0, - backColor, - 0, - textColor, - 1 - ), + [Enums.ButtonStateType.Enabled] = Types.newTextStyle(textColor, 0, backColor, 0, textColor, 1), [Enums.ButtonStateType.Disabled] = Types.newTextStyle( (function(): Color3 if thm.IsDarkMode then @@ -131,30 +98,9 @@ function Interface.cfusion( textColor, 1 ), - [Enums.ButtonStateType.Focused] = Types.newTextStyle( - textColor, - 0, - backColor, - 0, - textColor, - 1 - ), - [Enums.ButtonStateType.Hovered] = Types.newTextStyle( - textColor, - 0, - backColor, - 0, - textColor, - 1 - ), - [Enums.ButtonStateType.Pressed] = Types.newTextStyle( - textColor, - 0, - backColor, - 0, - textColor, - 1 - ), + [Enums.ButtonStateType.Focused] = Types.newTextStyle(textColor, 0, backColor, 0, textColor, 1), + [Enums.ButtonStateType.Hovered] = Types.newTextStyle(textColor, 0, backColor, 0, textColor, 1), + [Enums.ButtonStateType.Pressed] = Types.newTextStyle(textColor, 0, backColor, 0, textColor, 1), } return data end, themeState) @@ -162,7 +108,7 @@ function Interface.cfusion( local button = Base( maid, onClickState, - "", + "", _Computed(function(t: ThemeData): Font return t.Font end, themeState), @@ -183,4 +129,4 @@ function Interface.cfusion( return button end -return Interface \ No newline at end of file +return Interface diff --git a/src/Component/Button/FilledButton/cfusion.story.luau b/src/Component/Button/FilledButton/cfusion.story.luau index d4906360..36321802 100644 --- a/src/Component/Button/FilledButton/cfusion.story.luau +++ b/src/Component/Button/FilledButton/cfusion.story.luau @@ -19,13 +19,9 @@ local Icons = MaterialIcons.default.dp_48.scale_1 return function(frame: Frame) local maid = Maid.new() task.spawn(function() - local function makeHalfFrame( - isDarkMode: boolean, - color: Color3 - ): Frame - + local function makeHalfFrame(isDarkMode: boolean, color: Color3): Frame local halfFrame = maid:GiveTask(Instance.new("Frame")) - halfFrame.BackgroundColor3 = if isDarkMode then Color3.new(0.15,0.15,0.15) else Color3.new(0.85, 0.85, 0.85) + halfFrame.BackgroundColor3 = if isDarkMode then Color3.new(0.15, 0.15, 0.15) else Color3.new(0.85, 0.85, 0.85) local listLayout = maid:GiveTask(Instance.new("UIListLayout")) listLayout.FillDirection = Enum.FillDirection.Vertical @@ -35,62 +31,33 @@ return function(frame: Frame) listLayout.Parent = halfFrame local Module = require(script.Parent) - local theme = Types.newThemeData( - 1, - isDarkMode, - SCALE, - Font.fromEnum(Enum.Font.SourceSans), - color, - halfFrame.BackgroundColor3 - ) + local theme = Types.newThemeData(1, isDarkMode, SCALE, Font.fromEnum(Enum.Font.SourceSans), color, halfFrame.BackgroundColor3) do - local button = maid:GiveTask(Module.cfusion( - function() - print("click") - end, - "Button", - theme, - nil, - nil - )) + local button = maid:GiveTask(Module.cfusion(function() + print("click") + end, "Button", theme, nil, nil)) button.Parent = halfFrame end do - local button = maid:GiveTask(Module.cfusion( - function() - print("click") - end, - "Disabled", - theme, - nil, - false - )) + local button = maid:GiveTask(Module.cfusion(function() + print("click") + end, "Disabled", theme, nil, false)) button.Parent = halfFrame end do - local button = maid:GiveTask(Module.cfusion( - function() - print("click") - end, - "Icon", - theme, - Types.newImageData( - Icons.voice_chat.Image, - Icons.voice_chat.ImageRectOffset, - Icons.voice_chat.ImageRectSize - ), - true - )) + local button = maid:GiveTask(Module.cfusion(function() + print("click") + end, "Icon", theme, Types.newImageData(Icons.voice_chat.Image, Icons.voice_chat.ImageRectOffset, Icons.voice_chat.ImageRectSize), true)) button.Parent = halfFrame end return halfFrame end - local COLORS: {[number]: Color3} = { + local COLORS: { [number]: Color3 } = { Color3.fromHSV(0, 0.9, 0.8), Color3.fromHSV(0, 0.25, 0.8), Color3.fromHSV(0, 0.9, 0.5), @@ -100,29 +67,21 @@ return function(frame: Frame) } for i, color in ipairs(COLORS) do - local x = (i-1)/(#COLORS) - local width = 1/(#COLORS) - local dark = makeHalfFrame( - true, - color - ) - + local x = (i - 1) / #COLORS + local width = 1 / #COLORS + local dark = makeHalfFrame(true, color) + dark.Size = UDim2.fromScale(width, 0.5) dark.Position = UDim2.fromScale(x, 0.5) dark.Parent = frame - - local bright = makeHalfFrame( - false, - color - ) + + local bright = makeHalfFrame(false, color) bright.Size = UDim2.fromScale(width, 0.5) bright.Position = UDim2.fromScale(x, 0) bright.Parent = frame - end - end) return function() maid:Destroy() end -end \ No newline at end of file +end diff --git a/src/Component/Button/FilledButton/init.luau b/src/Component/Button/FilledButton/init.luau index 612e7e80..4f2f49d8 100644 --- a/src/Component/Button/FilledButton/init.luau +++ b/src/Component/Button/FilledButton/init.luau @@ -32,60 +32,41 @@ local DISABLE_BACK_TRANS = Config.Transparency.Background.Disabled -- References -- Private Functions - -- Class local Interface = {} -function Interface.cfusion( - onClick: CanBeState<() -> ()>, - text: CanBeState, - theme: CanBeState, - icon: CanBeState?, - isEnabled: CanBeState? -): ImageLabel +function Interface.cfusion(onClick: CanBeState<() -> ()>, text: CanBeState, theme: CanBeState, icon: CanBeState?, isEnabled: CanBeState?): ImageLabel local maid = Maid.new() local _fuse = ColdFusion.fuse(maid) - + local _new = _fuse.new local _bind = _fuse.bind local _clone = _fuse.clone local _import = _fuse.import - + local _Value = _fuse.Value local _Computed = _fuse.Computed local onClickState = _import(onClick, function() end) local textState = _import(text, "") - local themeState = _import(theme, Types.newThemeData( - 1, - false, - 1, - Font.fromEnum(Enum.Font.SourceSansSemibold), - Color3.fromHSV(0.8, 0.4, 0.8) - )) + local themeState = _import(theme, Types.newThemeData(1, false, 1, Font.fromEnum(Enum.Font.SourceSansSemibold), Color3.fromHSV(0.8, 0.4, 0.8))) local sound = maid:GiveTask(Instance.new("Sound")) sound.Volume = DEFAULT_VOLUME sound.SoundId = Sounds.ui_tap_variant_01 - local styles = _Computed(function(thm: ThemeData): {[Enums.ButtonStateType]: TextStyle} + local styles = _Computed(function(thm: ThemeData): { [Enums.ButtonStateType]: TextStyle } local backColor: Color3? local textColor: Color3? if thm.IsDarkMode then - backColor = Util.getReadableColor( - thm.Color3, - if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.DARK_SURFACE - ) + backColor = Util.getReadableColor(thm.Color3, if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.DARK_SURFACE) assert(backColor) textColor = Util.DARK_SURFACE else - backColor = Util.getReadableColor( - thm.Color3, - if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.LIGHT_SURFACE - ) + backColor = Util.getReadableColor(thm.Color3, if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.LIGHT_SURFACE) assert(backColor) textColor = Util.LIGHT_SURFACE @@ -93,32 +74,17 @@ function Interface.cfusion( assert(backColor) assert(textColor) - backColor = Util.getElevatedColor( - backColor, - thm.Elevation, - thm.IsDarkMode - ) + backColor = Util.getElevatedColor(backColor, thm.Elevation, thm.IsDarkMode) - textColor = Util.getElevatedColor( - textColor, - thm.Elevation, - thm.IsDarkMode - ) + textColor = Util.getElevatedColor(textColor, thm.Elevation, thm.IsDarkMode) local disableBackColor = (function(): Color3 - local h,s,v = backColor:ToHSV() - return Color3.fromHSV(h,s*0,v) + local h, s, v = backColor:ToHSV() + return Color3.fromHSV(h, s * 0, v) end)() local data = { - [Enums.ButtonStateType.Enabled] = Types.newTextStyle( - textColor, - 0, - backColor, - 0, - textColor, - 1 - ), + [Enums.ButtonStateType.Enabled] = Types.newTextStyle(textColor, 0, backColor, 0, textColor, 1), [Enums.ButtonStateType.Disabled] = Types.newTextStyle( (function(): Color3 if thm.IsDarkMode then @@ -133,30 +99,9 @@ function Interface.cfusion( textColor, 1 ), - [Enums.ButtonStateType.Focused] = Types.newTextStyle( - textColor, - 0, - backColor, - 0, - textColor, - 1 - ), - [Enums.ButtonStateType.Hovered] = Types.newTextStyle( - textColor, - 0, - backColor, - 0, - textColor, - 1 - ), - [Enums.ButtonStateType.Pressed] = Types.newTextStyle( - textColor, - 0, - backColor, - 0, - textColor, - 1 - ), + [Enums.ButtonStateType.Focused] = Types.newTextStyle(textColor, 0, backColor, 0, textColor, 1), + [Enums.ButtonStateType.Hovered] = Types.newTextStyle(textColor, 0, backColor, 0, textColor, 1), + [Enums.ButtonStateType.Pressed] = Types.newTextStyle(textColor, 0, backColor, 0, textColor, 1), } return data end, themeState) @@ -164,7 +109,7 @@ function Interface.cfusion( local button = Base( maid, onClickState, - textState, + textState, _Computed(function(t: ThemeData): Font return t.Font end, themeState), @@ -185,4 +130,4 @@ function Interface.cfusion( return button end -return Interface \ No newline at end of file +return Interface diff --git a/src/Component/Button/FilledIconButton/cfusion.story.luau b/src/Component/Button/FilledIconButton/cfusion.story.luau index 3827ddb3..559b26ba 100644 --- a/src/Component/Button/FilledIconButton/cfusion.story.luau +++ b/src/Component/Button/FilledIconButton/cfusion.story.luau @@ -19,13 +19,9 @@ local Icons = MaterialIcons.default.dp_48.scale_1 return function(frame: Frame) local maid = Maid.new() task.spawn(function() - local function makeHalfFrame( - isDarkMode: boolean, - color: Color3 - ): Frame - + local function makeHalfFrame(isDarkMode: boolean, color: Color3): Frame local halfFrame = maid:GiveTask(Instance.new("Frame")) - halfFrame.BackgroundColor3 = if isDarkMode then Color3.new(0.15,0.15,0.15) else Color3.new(0.85, 0.85, 0.85) + halfFrame.BackgroundColor3 = if isDarkMode then Color3.new(0.15, 0.15, 0.15) else Color3.new(0.85, 0.85, 0.85) local listLayout = maid:GiveTask(Instance.new("UIListLayout")) listLayout.FillDirection = Enum.FillDirection.Vertical @@ -34,50 +30,29 @@ return function(frame: Frame) listLayout.HorizontalAlignment = Enum.HorizontalAlignment.Center listLayout.Parent = halfFrame - local img = Types.newImageData( - Icons.voice_chat.Image, - Icons.voice_chat.ImageRectOffset, - Icons.voice_chat.ImageRectSize - ) + local img = Types.newImageData(Icons.voice_chat.Image, Icons.voice_chat.ImageRectOffset, Icons.voice_chat.ImageRectSize) local Module = require(script.Parent) - local theme = Types.newThemeData( - 1, - isDarkMode, - SCALE, - Font.fromEnum(Enum.Font.SourceSans), - color, - halfFrame.BackgroundColor3 - ) + local theme = Types.newThemeData(1, isDarkMode, SCALE, Font.fromEnum(Enum.Font.SourceSans), color, halfFrame.BackgroundColor3) do - local button = maid:GiveTask(Module.cfusion( - function() - print("click") - end, - img, - theme, - nil - )) + local button = maid:GiveTask(Module.cfusion(function() + print("click") + end, img, theme, nil)) button.Parent = halfFrame end do - local button = maid:GiveTask(Module.cfusion( - function() - print("click") - end, - img, - theme, - false - )) + local button = maid:GiveTask(Module.cfusion(function() + print("click") + end, img, theme, false)) button.Parent = halfFrame end return halfFrame end - local COLORS: {[number]: Color3} = { + local COLORS: { [number]: Color3 } = { Color3.fromHSV(0, 0.9, 0.8), Color3.fromHSV(0, 0.25, 0.8), Color3.fromHSV(0, 0.9, 0.5), @@ -87,29 +62,21 @@ return function(frame: Frame) } for i, color in ipairs(COLORS) do - local x = (i-1)/(#COLORS) - local width = 1/(#COLORS) - local dark = makeHalfFrame( - true, - color - ) - + local x = (i - 1) / #COLORS + local width = 1 / #COLORS + local dark = makeHalfFrame(true, color) + dark.Size = UDim2.fromScale(width, 0.5) dark.Position = UDim2.fromScale(x, 0.5) dark.Parent = frame - - local bright = makeHalfFrame( - false, - color - ) + + local bright = makeHalfFrame(false, color) bright.Size = UDim2.fromScale(width, 0.5) bright.Position = UDim2.fromScale(x, 0) bright.Parent = frame - end - end) return function() maid:Destroy() end -end \ No newline at end of file +end diff --git a/src/Component/Button/FilledIconButton/init.luau b/src/Component/Button/FilledIconButton/init.luau index 28ed322c..9a6ceb00 100644 --- a/src/Component/Button/FilledIconButton/init.luau +++ b/src/Component/Button/FilledIconButton/init.luau @@ -32,58 +32,40 @@ local DISABLE_BACK_TRANS = Config.Transparency.Background.Disabled -- References -- Private Functions - -- Class local Interface = {} -function Interface.cfusion( - onClick: CanBeState<() -> ()>, - icon: CanBeState, - theme: CanBeState, - isEnabled: CanBeState? -): ImageLabel +function Interface.cfusion(onClick: CanBeState<() -> ()>, icon: CanBeState, theme: CanBeState, isEnabled: CanBeState?): ImageLabel local maid = Maid.new() local _fuse = ColdFusion.fuse(maid) - + local _new = _fuse.new local _bind = _fuse.bind local _clone = _fuse.clone local _import = _fuse.import - + local _Value = _fuse.Value local _Computed = _fuse.Computed local onClickState = _import(onClick, function() end) - local themeState = _import(theme, Types.newThemeData( - 1, - false, - 1, - Font.fromEnum(Enum.Font.SourceSansSemibold), - Color3.fromHSV(0.8, 0.4, 0.8) - )) + local themeState = _import(theme, Types.newThemeData(1, false, 1, Font.fromEnum(Enum.Font.SourceSansSemibold), Color3.fromHSV(0.8, 0.4, 0.8))) local sound = maid:GiveTask(Instance.new("Sound")) sound.Volume = DEFAULT_VOLUME sound.SoundId = Sounds.ui_tap_variant_01 - local styles = _Computed(function(thm: ThemeData): {[Enums.ButtonStateType]: TextStyle} + local styles = _Computed(function(thm: ThemeData): { [Enums.ButtonStateType]: TextStyle } local backColor: Color3? local textColor: Color3? if thm.IsDarkMode then - backColor = Util.getReadableColor( - thm.Color3, - if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.DARK_SURFACE - ) + backColor = Util.getReadableColor(thm.Color3, if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.DARK_SURFACE) assert(backColor) textColor = Util.DARK_SURFACE else - backColor = Util.getReadableColor( - thm.Color3, - if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.LIGHT_SURFACE - ) + backColor = Util.getReadableColor(thm.Color3, if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.LIGHT_SURFACE) assert(backColor) textColor = Util.LIGHT_SURFACE @@ -91,32 +73,17 @@ function Interface.cfusion( assert(backColor) assert(textColor) - backColor = Util.getElevatedColor( - backColor, - thm.Elevation, - thm.IsDarkMode - ) + backColor = Util.getElevatedColor(backColor, thm.Elevation, thm.IsDarkMode) - textColor = Util.getElevatedColor( - textColor, - thm.Elevation, - thm.IsDarkMode - ) + textColor = Util.getElevatedColor(textColor, thm.Elevation, thm.IsDarkMode) local disableBackColor = (function(): Color3 - local h,s,v = backColor:ToHSV() - return Color3.fromHSV(h,s*0,v) + local h, s, v = backColor:ToHSV() + return Color3.fromHSV(h, s * 0, v) end)() local data = { - [Enums.ButtonStateType.Enabled] = Types.newTextStyle( - textColor, - 0, - backColor, - 0, - textColor, - 1 - ), + [Enums.ButtonStateType.Enabled] = Types.newTextStyle(textColor, 0, backColor, 0, textColor, 1), [Enums.ButtonStateType.Disabled] = Types.newTextStyle( (function(): Color3 if thm.IsDarkMode then @@ -131,30 +98,9 @@ function Interface.cfusion( textColor, 1 ), - [Enums.ButtonStateType.Focused] = Types.newTextStyle( - textColor, - 0, - backColor, - 0, - textColor, - 1 - ), - [Enums.ButtonStateType.Hovered] = Types.newTextStyle( - textColor, - 0, - backColor, - 0, - textColor, - 1 - ), - [Enums.ButtonStateType.Pressed] = Types.newTextStyle( - textColor, - 0, - backColor, - 0, - textColor, - 1 - ), + [Enums.ButtonStateType.Focused] = Types.newTextStyle(textColor, 0, backColor, 0, textColor, 1), + [Enums.ButtonStateType.Hovered] = Types.newTextStyle(textColor, 0, backColor, 0, textColor, 1), + [Enums.ButtonStateType.Pressed] = Types.newTextStyle(textColor, 0, backColor, 0, textColor, 1), } return data end, themeState) @@ -162,7 +108,7 @@ function Interface.cfusion( local button = Base( maid, onClickState, - "", + "", _Computed(function(t: ThemeData): Font return t.Font end, themeState), @@ -171,7 +117,7 @@ function Interface.cfusion( if isEnabled == nil then true else isEnabled, false, _Computed(function(t: ThemeData): number - return t.Scale*0.85 + return t.Scale * 0.85 end, themeState), sound, false, @@ -183,4 +129,4 @@ function Interface.cfusion( return button end -return Interface \ No newline at end of file +return Interface diff --git a/src/Component/Button/IconButton/cfusion.story.luau b/src/Component/Button/IconButton/cfusion.story.luau index 3827ddb3..559b26ba 100644 --- a/src/Component/Button/IconButton/cfusion.story.luau +++ b/src/Component/Button/IconButton/cfusion.story.luau @@ -19,13 +19,9 @@ local Icons = MaterialIcons.default.dp_48.scale_1 return function(frame: Frame) local maid = Maid.new() task.spawn(function() - local function makeHalfFrame( - isDarkMode: boolean, - color: Color3 - ): Frame - + local function makeHalfFrame(isDarkMode: boolean, color: Color3): Frame local halfFrame = maid:GiveTask(Instance.new("Frame")) - halfFrame.BackgroundColor3 = if isDarkMode then Color3.new(0.15,0.15,0.15) else Color3.new(0.85, 0.85, 0.85) + halfFrame.BackgroundColor3 = if isDarkMode then Color3.new(0.15, 0.15, 0.15) else Color3.new(0.85, 0.85, 0.85) local listLayout = maid:GiveTask(Instance.new("UIListLayout")) listLayout.FillDirection = Enum.FillDirection.Vertical @@ -34,50 +30,29 @@ return function(frame: Frame) listLayout.HorizontalAlignment = Enum.HorizontalAlignment.Center listLayout.Parent = halfFrame - local img = Types.newImageData( - Icons.voice_chat.Image, - Icons.voice_chat.ImageRectOffset, - Icons.voice_chat.ImageRectSize - ) + local img = Types.newImageData(Icons.voice_chat.Image, Icons.voice_chat.ImageRectOffset, Icons.voice_chat.ImageRectSize) local Module = require(script.Parent) - local theme = Types.newThemeData( - 1, - isDarkMode, - SCALE, - Font.fromEnum(Enum.Font.SourceSans), - color, - halfFrame.BackgroundColor3 - ) + local theme = Types.newThemeData(1, isDarkMode, SCALE, Font.fromEnum(Enum.Font.SourceSans), color, halfFrame.BackgroundColor3) do - local button = maid:GiveTask(Module.cfusion( - function() - print("click") - end, - img, - theme, - nil - )) + local button = maid:GiveTask(Module.cfusion(function() + print("click") + end, img, theme, nil)) button.Parent = halfFrame end do - local button = maid:GiveTask(Module.cfusion( - function() - print("click") - end, - img, - theme, - false - )) + local button = maid:GiveTask(Module.cfusion(function() + print("click") + end, img, theme, false)) button.Parent = halfFrame end return halfFrame end - local COLORS: {[number]: Color3} = { + local COLORS: { [number]: Color3 } = { Color3.fromHSV(0, 0.9, 0.8), Color3.fromHSV(0, 0.25, 0.8), Color3.fromHSV(0, 0.9, 0.5), @@ -87,29 +62,21 @@ return function(frame: Frame) } for i, color in ipairs(COLORS) do - local x = (i-1)/(#COLORS) - local width = 1/(#COLORS) - local dark = makeHalfFrame( - true, - color - ) - + local x = (i - 1) / #COLORS + local width = 1 / #COLORS + local dark = makeHalfFrame(true, color) + dark.Size = UDim2.fromScale(width, 0.5) dark.Position = UDim2.fromScale(x, 0.5) dark.Parent = frame - - local bright = makeHalfFrame( - false, - color - ) + + local bright = makeHalfFrame(false, color) bright.Size = UDim2.fromScale(width, 0.5) bright.Position = UDim2.fromScale(x, 0) bright.Parent = frame - end - end) return function() maid:Destroy() end -end \ No newline at end of file +end diff --git a/src/Component/Button/IconButton/init.luau b/src/Component/Button/IconButton/init.luau index 99fa8fd1..0b20e091 100644 --- a/src/Component/Button/IconButton/init.luau +++ b/src/Component/Button/IconButton/init.luau @@ -34,83 +34,48 @@ local DISABLE_TRANSPARENCY = Config.Transparency.Text.Disabled -- References -- Private Functions - -- Class local Interface = {} -function Interface.cfusion( - onClick: CanBeState<() -> ()>, - icon: CanBeState, - theme: CanBeState, - isEnabled: CanBeState? -): ImageLabel +function Interface.cfusion(onClick: CanBeState<() -> ()>, icon: CanBeState, theme: CanBeState, isEnabled: CanBeState?): ImageLabel local maid = Maid.new() local _fuse = ColdFusion.fuse(maid) - + local _new = _fuse.new local _bind = _fuse.bind local _clone = _fuse.clone local _import = _fuse.import - + local _Value = _fuse.Value local _Computed = _fuse.Computed local onClickState = _import(onClick, function() end) - local themeState = _import(theme, Types.newThemeData( - 1, - false, - 1, - Font.fromEnum(Enum.Font.SourceSansSemibold), - Color3.fromHSV(0.8, 0.4, 0.8) - )) + local themeState = _import(theme, Types.newThemeData(1, false, 1, Font.fromEnum(Enum.Font.SourceSansSemibold), Color3.fromHSV(0.8, 0.4, 0.8))) local sound = maid:GiveTask(Instance.new("Sound")) sound.Volume = DEFAULT_VOLUME sound.SoundId = Sounds.ui_tap_variant_01 - local styles = _Computed(function(thm: ThemeData): {[Enums.ButtonStateType]: TextStyle} + local styles = _Computed(function(thm: ThemeData): { [Enums.ButtonStateType]: TextStyle } local textColor: Color3? if thm.IsDarkMode then - textColor = Util.getReadableColor( - thm.Color3, - if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.DARK_SURFACE - ) + textColor = Util.getReadableColor(thm.Color3, if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.DARK_SURFACE) else - textColor = Util.getReadableColor( - thm.Color3, - if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.LIGHT_SURFACE - ) + textColor = Util.getReadableColor(thm.Color3, if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.LIGHT_SURFACE) end assert(textColor) - textColor = Util.getElevatedColor( - textColor, - thm.Elevation, - thm.IsDarkMode - ) + textColor = Util.getElevatedColor(textColor, thm.Elevation, thm.IsDarkMode) local data = { - [Enums.ButtonStateType.Enabled] = Types.newTextStyle( - textColor, - 0, - textColor, - 1, - textColor, - 1 - ), + [Enums.ButtonStateType.Enabled] = Types.newTextStyle(textColor, 0, textColor, 1, textColor, 1), [Enums.ButtonStateType.Disabled] = Types.newTextStyle( (function(): Color3 if thm.IsDarkMode then - local h,_s,v = textColor:ToHSV() - return Util.getReadableColor( - Color3.fromHSV(h,0,v), - if thm.BackgroundColor3 then thm.BackgroundColor3 else Color3.new(0.15,0.15,0.15) - ) + local h, _s, v = textColor:ToHSV() + return Util.getReadableColor(Color3.fromHSV(h, 0, v), if thm.BackgroundColor3 then thm.BackgroundColor3 else Color3.new(0.15, 0.15, 0.15)) else - local h,_s,v = textColor:ToHSV() - return Util.getReadableColor( - Color3.fromHSV(h,0,v), - if thm.BackgroundColor3 then thm.BackgroundColor3 else Color3.new(0.85,0.85,0.85) - ) + local h, _s, v = textColor:ToHSV() + return Util.getReadableColor(Color3.fromHSV(h, 0, v), if thm.BackgroundColor3 then thm.BackgroundColor3 else Color3.new(0.85, 0.85, 0.85)) end end)(), DISABLE_TRANSPARENCY, @@ -119,30 +84,9 @@ function Interface.cfusion( textColor, 1 ), - [Enums.ButtonStateType.Focused] = Types.newTextStyle( - textColor, - 0, - textColor, - FOCUS_TRANSPARENCY, - textColor, - 1 - ), - [Enums.ButtonStateType.Hovered] = Types.newTextStyle( - textColor, - 0, - textColor, - HOVER_TRANSPARENCY, - textColor, - 1 - ), - [Enums.ButtonStateType.Pressed] = Types.newTextStyle( - textColor, - 0, - textColor, - PRESS_TRANSPARENCY, - textColor, - 1 - ), + [Enums.ButtonStateType.Focused] = Types.newTextStyle(textColor, 0, textColor, FOCUS_TRANSPARENCY, textColor, 1), + [Enums.ButtonStateType.Hovered] = Types.newTextStyle(textColor, 0, textColor, HOVER_TRANSPARENCY, textColor, 1), + [Enums.ButtonStateType.Pressed] = Types.newTextStyle(textColor, 0, textColor, PRESS_TRANSPARENCY, textColor, 1), } return data end, themeState) @@ -150,7 +94,7 @@ function Interface.cfusion( local button = Base( maid, onClickState, - "", + "", _Computed(function(t: ThemeData): Font return t.Font end, themeState), @@ -170,4 +114,4 @@ function Interface.cfusion( return button end -return Interface \ No newline at end of file +return Interface diff --git a/src/Component/Button/OutlinedButton/cfusion.story.luau b/src/Component/Button/OutlinedButton/cfusion.story.luau index d4906360..36321802 100644 --- a/src/Component/Button/OutlinedButton/cfusion.story.luau +++ b/src/Component/Button/OutlinedButton/cfusion.story.luau @@ -19,13 +19,9 @@ local Icons = MaterialIcons.default.dp_48.scale_1 return function(frame: Frame) local maid = Maid.new() task.spawn(function() - local function makeHalfFrame( - isDarkMode: boolean, - color: Color3 - ): Frame - + local function makeHalfFrame(isDarkMode: boolean, color: Color3): Frame local halfFrame = maid:GiveTask(Instance.new("Frame")) - halfFrame.BackgroundColor3 = if isDarkMode then Color3.new(0.15,0.15,0.15) else Color3.new(0.85, 0.85, 0.85) + halfFrame.BackgroundColor3 = if isDarkMode then Color3.new(0.15, 0.15, 0.15) else Color3.new(0.85, 0.85, 0.85) local listLayout = maid:GiveTask(Instance.new("UIListLayout")) listLayout.FillDirection = Enum.FillDirection.Vertical @@ -35,62 +31,33 @@ return function(frame: Frame) listLayout.Parent = halfFrame local Module = require(script.Parent) - local theme = Types.newThemeData( - 1, - isDarkMode, - SCALE, - Font.fromEnum(Enum.Font.SourceSans), - color, - halfFrame.BackgroundColor3 - ) + local theme = Types.newThemeData(1, isDarkMode, SCALE, Font.fromEnum(Enum.Font.SourceSans), color, halfFrame.BackgroundColor3) do - local button = maid:GiveTask(Module.cfusion( - function() - print("click") - end, - "Button", - theme, - nil, - nil - )) + local button = maid:GiveTask(Module.cfusion(function() + print("click") + end, "Button", theme, nil, nil)) button.Parent = halfFrame end do - local button = maid:GiveTask(Module.cfusion( - function() - print("click") - end, - "Disabled", - theme, - nil, - false - )) + local button = maid:GiveTask(Module.cfusion(function() + print("click") + end, "Disabled", theme, nil, false)) button.Parent = halfFrame end do - local button = maid:GiveTask(Module.cfusion( - function() - print("click") - end, - "Icon", - theme, - Types.newImageData( - Icons.voice_chat.Image, - Icons.voice_chat.ImageRectOffset, - Icons.voice_chat.ImageRectSize - ), - true - )) + local button = maid:GiveTask(Module.cfusion(function() + print("click") + end, "Icon", theme, Types.newImageData(Icons.voice_chat.Image, Icons.voice_chat.ImageRectOffset, Icons.voice_chat.ImageRectSize), true)) button.Parent = halfFrame end return halfFrame end - local COLORS: {[number]: Color3} = { + local COLORS: { [number]: Color3 } = { Color3.fromHSV(0, 0.9, 0.8), Color3.fromHSV(0, 0.25, 0.8), Color3.fromHSV(0, 0.9, 0.5), @@ -100,29 +67,21 @@ return function(frame: Frame) } for i, color in ipairs(COLORS) do - local x = (i-1)/(#COLORS) - local width = 1/(#COLORS) - local dark = makeHalfFrame( - true, - color - ) - + local x = (i - 1) / #COLORS + local width = 1 / #COLORS + local dark = makeHalfFrame(true, color) + dark.Size = UDim2.fromScale(width, 0.5) dark.Position = UDim2.fromScale(x, 0.5) dark.Parent = frame - - local bright = makeHalfFrame( - false, - color - ) + + local bright = makeHalfFrame(false, color) bright.Size = UDim2.fromScale(width, 0.5) bright.Position = UDim2.fromScale(x, 0) bright.Parent = frame - end - end) return function() maid:Destroy() end -end \ No newline at end of file +end diff --git a/src/Component/Button/OutlinedButton/init.luau b/src/Component/Button/OutlinedButton/init.luau index 589a7e15..64d199ff 100644 --- a/src/Component/Button/OutlinedButton/init.luau +++ b/src/Component/Button/OutlinedButton/init.luau @@ -34,91 +34,53 @@ local DISABLE_TRANSPARENCY = Config.Transparency.Text.Disabled -- References -- Private Functions - -- Class local Interface = {} -function Interface.cfusion( - onClick: CanBeState<() -> ()>, - text: CanBeState, - theme: CanBeState, - icon: CanBeState?, - isEnabled: CanBeState? -): ImageLabel +function Interface.cfusion(onClick: CanBeState<() -> ()>, text: CanBeState, theme: CanBeState, icon: CanBeState?, isEnabled: CanBeState?): ImageLabel local maid = Maid.new() local _fuse = ColdFusion.fuse(maid) - + local _new = _fuse.new local _bind = _fuse.bind local _clone = _fuse.clone local _import = _fuse.import - + local _Value = _fuse.Value local _Computed = _fuse.Computed local onClickState = _import(onClick, function() end) local textState = _import(text, "") - local themeState = _import(theme, Types.newThemeData( - 1, - false, - 1, - Font.fromEnum(Enum.Font.SourceSansSemibold), - Color3.fromHSV(0.8, 0.4, 0.8) - )) + local themeState = _import(theme, Types.newThemeData(1, false, 1, Font.fromEnum(Enum.Font.SourceSansSemibold), Color3.fromHSV(0.8, 0.4, 0.8))) local sound = maid:GiveTask(Instance.new("Sound")) sound.Volume = DEFAULT_VOLUME sound.SoundId = Sounds.ui_tap_variant_01 - local styles = _Computed(function(thm: ThemeData): {[Enums.ButtonStateType]: TextStyle} + local styles = _Computed(function(thm: ThemeData): { [Enums.ButtonStateType]: TextStyle } local textColor: Color3? if thm.IsDarkMode then - textColor = Util.getReadableColor( - thm.Color3, - if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.DARK_SURFACE, - 12 - ) + textColor = Util.getReadableColor(thm.Color3, if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.DARK_SURFACE, 12) else - textColor = Util.getReadableColor( - thm.Color3, - if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.LIGHT_SURFACE, - 5 - ) + textColor = Util.getReadableColor(thm.Color3, if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.LIGHT_SURFACE, 5) end assert(textColor) - textColor = Util.getElevatedColor( - textColor, - thm.Elevation, - thm.IsDarkMode - ) + textColor = Util.getElevatedColor(textColor, thm.Elevation, thm.IsDarkMode) local borderColor = (function() - local h,s,v = textColor:ToHSV() - return Color3.fromHSV(h,s*0.25,v*0.8) + local h, s, v = textColor:ToHSV() + return Color3.fromHSV(h, s * 0.25, v * 0.8) end)() local data = { - [Enums.ButtonStateType.Enabled] = Types.newTextStyle( - textColor, - 0, - textColor, - 1, - borderColor, - 0 - ), + [Enums.ButtonStateType.Enabled] = Types.newTextStyle(textColor, 0, textColor, 1, borderColor, 0), [Enums.ButtonStateType.Disabled] = Types.newTextStyle( (function(): Color3 if thm.IsDarkMode then - local h,_s,v = textColor:ToHSV() - return Util.getReadableColor( - Color3.fromHSV(h,0,v), - if thm.BackgroundColor3 then thm.BackgroundColor3 else Color3.new(0.15,0.15,0.15) - ) + local h, _s, v = textColor:ToHSV() + return Util.getReadableColor(Color3.fromHSV(h, 0, v), if thm.BackgroundColor3 then thm.BackgroundColor3 else Color3.new(0.15, 0.15, 0.15)) else - local h,_s,v = textColor:ToHSV() - return Util.getReadableColor( - Color3.fromHSV(h,0,v), - if thm.BackgroundColor3 then thm.BackgroundColor3 else Color3.new(0.85,0.85,0.85) - ) + local h, _s, v = textColor:ToHSV() + return Util.getReadableColor(Color3.fromHSV(h, 0, v), if thm.BackgroundColor3 then thm.BackgroundColor3 else Color3.new(0.85, 0.85, 0.85)) end end)(), DISABLE_TRANSPARENCY, @@ -127,30 +89,9 @@ function Interface.cfusion( borderColor, DISABLE_TRANSPARENCY ), - [Enums.ButtonStateType.Focused] = Types.newTextStyle( - textColor, - 0, - textColor, - FOCUS_TRANSPARENCY, - textColor, - FOCUS_TRANSPARENCY - ), - [Enums.ButtonStateType.Hovered] = Types.newTextStyle( - textColor, - 0, - textColor, - HOVER_TRANSPARENCY, - borderColor, - HOVER_TRANSPARENCY - ), - [Enums.ButtonStateType.Pressed] = Types.newTextStyle( - textColor, - 0, - textColor, - PRESS_TRANSPARENCY, - borderColor, - PRESS_TRANSPARENCY - ), + [Enums.ButtonStateType.Focused] = Types.newTextStyle(textColor, 0, textColor, FOCUS_TRANSPARENCY, textColor, FOCUS_TRANSPARENCY), + [Enums.ButtonStateType.Hovered] = Types.newTextStyle(textColor, 0, textColor, HOVER_TRANSPARENCY, borderColor, HOVER_TRANSPARENCY), + [Enums.ButtonStateType.Pressed] = Types.newTextStyle(textColor, 0, textColor, PRESS_TRANSPARENCY, borderColor, PRESS_TRANSPARENCY), } return data end, themeState) @@ -158,7 +99,7 @@ function Interface.cfusion( local button = Base( maid, onClickState, - textState, + textState, _Computed(function(t: ThemeData): Font return t.Font end, themeState), @@ -175,4 +116,4 @@ function Interface.cfusion( return button end -return Interface \ No newline at end of file +return Interface diff --git a/src/Component/Button/OutlinedIconButton/cfusion.story.luau b/src/Component/Button/OutlinedIconButton/cfusion.story.luau index 3827ddb3..559b26ba 100644 --- a/src/Component/Button/OutlinedIconButton/cfusion.story.luau +++ b/src/Component/Button/OutlinedIconButton/cfusion.story.luau @@ -19,13 +19,9 @@ local Icons = MaterialIcons.default.dp_48.scale_1 return function(frame: Frame) local maid = Maid.new() task.spawn(function() - local function makeHalfFrame( - isDarkMode: boolean, - color: Color3 - ): Frame - + local function makeHalfFrame(isDarkMode: boolean, color: Color3): Frame local halfFrame = maid:GiveTask(Instance.new("Frame")) - halfFrame.BackgroundColor3 = if isDarkMode then Color3.new(0.15,0.15,0.15) else Color3.new(0.85, 0.85, 0.85) + halfFrame.BackgroundColor3 = if isDarkMode then Color3.new(0.15, 0.15, 0.15) else Color3.new(0.85, 0.85, 0.85) local listLayout = maid:GiveTask(Instance.new("UIListLayout")) listLayout.FillDirection = Enum.FillDirection.Vertical @@ -34,50 +30,29 @@ return function(frame: Frame) listLayout.HorizontalAlignment = Enum.HorizontalAlignment.Center listLayout.Parent = halfFrame - local img = Types.newImageData( - Icons.voice_chat.Image, - Icons.voice_chat.ImageRectOffset, - Icons.voice_chat.ImageRectSize - ) + local img = Types.newImageData(Icons.voice_chat.Image, Icons.voice_chat.ImageRectOffset, Icons.voice_chat.ImageRectSize) local Module = require(script.Parent) - local theme = Types.newThemeData( - 1, - isDarkMode, - SCALE, - Font.fromEnum(Enum.Font.SourceSans), - color, - halfFrame.BackgroundColor3 - ) + local theme = Types.newThemeData(1, isDarkMode, SCALE, Font.fromEnum(Enum.Font.SourceSans), color, halfFrame.BackgroundColor3) do - local button = maid:GiveTask(Module.cfusion( - function() - print("click") - end, - img, - theme, - nil - )) + local button = maid:GiveTask(Module.cfusion(function() + print("click") + end, img, theme, nil)) button.Parent = halfFrame end do - local button = maid:GiveTask(Module.cfusion( - function() - print("click") - end, - img, - theme, - false - )) + local button = maid:GiveTask(Module.cfusion(function() + print("click") + end, img, theme, false)) button.Parent = halfFrame end return halfFrame end - local COLORS: {[number]: Color3} = { + local COLORS: { [number]: Color3 } = { Color3.fromHSV(0, 0.9, 0.8), Color3.fromHSV(0, 0.25, 0.8), Color3.fromHSV(0, 0.9, 0.5), @@ -87,29 +62,21 @@ return function(frame: Frame) } for i, color in ipairs(COLORS) do - local x = (i-1)/(#COLORS) - local width = 1/(#COLORS) - local dark = makeHalfFrame( - true, - color - ) - + local x = (i - 1) / #COLORS + local width = 1 / #COLORS + local dark = makeHalfFrame(true, color) + dark.Size = UDim2.fromScale(width, 0.5) dark.Position = UDim2.fromScale(x, 0.5) dark.Parent = frame - - local bright = makeHalfFrame( - false, - color - ) + + local bright = makeHalfFrame(false, color) bright.Size = UDim2.fromScale(width, 0.5) bright.Position = UDim2.fromScale(x, 0) bright.Parent = frame - end - end) return function() maid:Destroy() end -end \ No newline at end of file +end diff --git a/src/Component/Button/OutlinedIconButton/init.luau b/src/Component/Button/OutlinedIconButton/init.luau index c403fcba..c50ba305 100644 --- a/src/Component/Button/OutlinedIconButton/init.luau +++ b/src/Component/Button/OutlinedIconButton/init.luau @@ -34,89 +34,52 @@ local DISABLE_TRANSPARENCY = Config.Transparency.Text.Disabled -- References -- Private Functions - -- Class local Interface = {} -function Interface.cfusion( - onClick: CanBeState<() -> ()>, - icon: CanBeState, - theme: CanBeState, - isEnabled: CanBeState? -): ImageLabel +function Interface.cfusion(onClick: CanBeState<() -> ()>, icon: CanBeState, theme: CanBeState, isEnabled: CanBeState?): ImageLabel local maid = Maid.new() local _fuse = ColdFusion.fuse(maid) - + local _new = _fuse.new local _bind = _fuse.bind local _clone = _fuse.clone local _import = _fuse.import - + local _Value = _fuse.Value local _Computed = _fuse.Computed local onClickState = _import(onClick, function() end) - local themeState = _import(theme, Types.newThemeData( - 1, - false, - 1, - Font.fromEnum(Enum.Font.SourceSansSemibold), - Color3.fromHSV(0.8, 0.4, 0.8) - )) + local themeState = _import(theme, Types.newThemeData(1, false, 1, Font.fromEnum(Enum.Font.SourceSansSemibold), Color3.fromHSV(0.8, 0.4, 0.8))) local sound = maid:GiveTask(Instance.new("Sound")) sound.Volume = DEFAULT_VOLUME sound.SoundId = Sounds.ui_tap_variant_01 - local styles = _Computed(function(thm: ThemeData): {[Enums.ButtonStateType]: TextStyle} + local styles = _Computed(function(thm: ThemeData): { [Enums.ButtonStateType]: TextStyle } local textColor: Color3? if thm.IsDarkMode then - textColor = Util.getReadableColor( - thm.Color3, - if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.DARK_SURFACE, - 12 - ) + textColor = Util.getReadableColor(thm.Color3, if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.DARK_SURFACE, 12) else - textColor = Util.getReadableColor( - thm.Color3, - if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.LIGHT_SURFACE, - 5 - ) + textColor = Util.getReadableColor(thm.Color3, if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.LIGHT_SURFACE, 5) end assert(textColor) - textColor = Util.getElevatedColor( - textColor, - thm.Elevation, - thm.IsDarkMode - ) + textColor = Util.getElevatedColor(textColor, thm.Elevation, thm.IsDarkMode) local borderColor = (function() - local h,s,v = textColor:ToHSV() - return Color3.fromHSV(h,s*0.25,v*0.8) + local h, s, v = textColor:ToHSV() + return Color3.fromHSV(h, s * 0.25, v * 0.8) end)() local data = { - [Enums.ButtonStateType.Enabled] = Types.newTextStyle( - textColor, - 0, - textColor, - 1, - borderColor, - 0 - ), + [Enums.ButtonStateType.Enabled] = Types.newTextStyle(textColor, 0, textColor, 1, borderColor, 0), [Enums.ButtonStateType.Disabled] = Types.newTextStyle( (function(): Color3 if thm.IsDarkMode then - local h,_s,v = textColor:ToHSV() - return Util.getReadableColor( - Color3.fromHSV(h,0,v), - if thm.BackgroundColor3 then thm.BackgroundColor3 else Color3.new(0.15,0.15,0.15) - ) + local h, _s, v = textColor:ToHSV() + return Util.getReadableColor(Color3.fromHSV(h, 0, v), if thm.BackgroundColor3 then thm.BackgroundColor3 else Color3.new(0.15, 0.15, 0.15)) else - local h,_s,v = textColor:ToHSV() - return Util.getReadableColor( - Color3.fromHSV(h,0,v), - if thm.BackgroundColor3 then thm.BackgroundColor3 else Color3.new(0.85,0.85,0.85) - ) + local h, _s, v = textColor:ToHSV() + return Util.getReadableColor(Color3.fromHSV(h, 0, v), if thm.BackgroundColor3 then thm.BackgroundColor3 else Color3.new(0.85, 0.85, 0.85)) end end)(), DISABLE_TRANSPARENCY, @@ -125,30 +88,9 @@ function Interface.cfusion( borderColor, DISABLE_TRANSPARENCY ), - [Enums.ButtonStateType.Focused] = Types.newTextStyle( - textColor, - 0, - textColor, - FOCUS_TRANSPARENCY, - textColor, - FOCUS_TRANSPARENCY - ), - [Enums.ButtonStateType.Hovered] = Types.newTextStyle( - textColor, - 0, - textColor, - HOVER_TRANSPARENCY, - borderColor, - HOVER_TRANSPARENCY - ), - [Enums.ButtonStateType.Pressed] = Types.newTextStyle( - textColor, - 0, - textColor, - PRESS_TRANSPARENCY, - borderColor, - PRESS_TRANSPARENCY - ), + [Enums.ButtonStateType.Focused] = Types.newTextStyle(textColor, 0, textColor, FOCUS_TRANSPARENCY, textColor, FOCUS_TRANSPARENCY), + [Enums.ButtonStateType.Hovered] = Types.newTextStyle(textColor, 0, textColor, HOVER_TRANSPARENCY, borderColor, HOVER_TRANSPARENCY), + [Enums.ButtonStateType.Pressed] = Types.newTextStyle(textColor, 0, textColor, PRESS_TRANSPARENCY, borderColor, PRESS_TRANSPARENCY), } return data end, themeState) @@ -156,7 +98,7 @@ function Interface.cfusion( local button = Base( maid, onClickState, - "", + "", _Computed(function(t: ThemeData): Font return t.Font end, themeState), @@ -165,7 +107,7 @@ function Interface.cfusion( if isEnabled == nil then true else isEnabled, false, _Computed(function(t: ThemeData): number - return t.Scale*0.85 + return t.Scale * 0.85 end, themeState), sound, false, @@ -176,4 +118,4 @@ function Interface.cfusion( return button end -return Interface \ No newline at end of file +return Interface diff --git a/src/Component/Button/TextButton/cfusion.story.luau b/src/Component/Button/TextButton/cfusion.story.luau index d4906360..36321802 100644 --- a/src/Component/Button/TextButton/cfusion.story.luau +++ b/src/Component/Button/TextButton/cfusion.story.luau @@ -19,13 +19,9 @@ local Icons = MaterialIcons.default.dp_48.scale_1 return function(frame: Frame) local maid = Maid.new() task.spawn(function() - local function makeHalfFrame( - isDarkMode: boolean, - color: Color3 - ): Frame - + local function makeHalfFrame(isDarkMode: boolean, color: Color3): Frame local halfFrame = maid:GiveTask(Instance.new("Frame")) - halfFrame.BackgroundColor3 = if isDarkMode then Color3.new(0.15,0.15,0.15) else Color3.new(0.85, 0.85, 0.85) + halfFrame.BackgroundColor3 = if isDarkMode then Color3.new(0.15, 0.15, 0.15) else Color3.new(0.85, 0.85, 0.85) local listLayout = maid:GiveTask(Instance.new("UIListLayout")) listLayout.FillDirection = Enum.FillDirection.Vertical @@ -35,62 +31,33 @@ return function(frame: Frame) listLayout.Parent = halfFrame local Module = require(script.Parent) - local theme = Types.newThemeData( - 1, - isDarkMode, - SCALE, - Font.fromEnum(Enum.Font.SourceSans), - color, - halfFrame.BackgroundColor3 - ) + local theme = Types.newThemeData(1, isDarkMode, SCALE, Font.fromEnum(Enum.Font.SourceSans), color, halfFrame.BackgroundColor3) do - local button = maid:GiveTask(Module.cfusion( - function() - print("click") - end, - "Button", - theme, - nil, - nil - )) + local button = maid:GiveTask(Module.cfusion(function() + print("click") + end, "Button", theme, nil, nil)) button.Parent = halfFrame end do - local button = maid:GiveTask(Module.cfusion( - function() - print("click") - end, - "Disabled", - theme, - nil, - false - )) + local button = maid:GiveTask(Module.cfusion(function() + print("click") + end, "Disabled", theme, nil, false)) button.Parent = halfFrame end do - local button = maid:GiveTask(Module.cfusion( - function() - print("click") - end, - "Icon", - theme, - Types.newImageData( - Icons.voice_chat.Image, - Icons.voice_chat.ImageRectOffset, - Icons.voice_chat.ImageRectSize - ), - true - )) + local button = maid:GiveTask(Module.cfusion(function() + print("click") + end, "Icon", theme, Types.newImageData(Icons.voice_chat.Image, Icons.voice_chat.ImageRectOffset, Icons.voice_chat.ImageRectSize), true)) button.Parent = halfFrame end return halfFrame end - local COLORS: {[number]: Color3} = { + local COLORS: { [number]: Color3 } = { Color3.fromHSV(0, 0.9, 0.8), Color3.fromHSV(0, 0.25, 0.8), Color3.fromHSV(0, 0.9, 0.5), @@ -100,29 +67,21 @@ return function(frame: Frame) } for i, color in ipairs(COLORS) do - local x = (i-1)/(#COLORS) - local width = 1/(#COLORS) - local dark = makeHalfFrame( - true, - color - ) - + local x = (i - 1) / #COLORS + local width = 1 / #COLORS + local dark = makeHalfFrame(true, color) + dark.Size = UDim2.fromScale(width, 0.5) dark.Position = UDim2.fromScale(x, 0.5) dark.Parent = frame - - local bright = makeHalfFrame( - false, - color - ) + + local bright = makeHalfFrame(false, color) bright.Size = UDim2.fromScale(width, 0.5) bright.Position = UDim2.fromScale(x, 0) bright.Parent = frame - end - end) return function() maid:Destroy() end -end \ No newline at end of file +end diff --git a/src/Component/Button/TextButton/init.luau b/src/Component/Button/TextButton/init.luau index 0912aca5..e8fc828c 100644 --- a/src/Component/Button/TextButton/init.luau +++ b/src/Component/Button/TextButton/init.luau @@ -34,85 +34,49 @@ local DISABLE_TRANSPARENCY = Config.Transparency.Text.Disabled -- References -- Private Functions - -- Class local Interface = {} -function Interface.cfusion( - onClick: CanBeState<() -> ()>, - text: CanBeState, - theme: CanBeState, - icon: CanBeState?, - isEnabled: CanBeState? -): ImageLabel +function Interface.cfusion(onClick: CanBeState<() -> ()>, text: CanBeState, theme: CanBeState, icon: CanBeState?, isEnabled: CanBeState?): ImageLabel local maid = Maid.new() local _fuse = ColdFusion.fuse(maid) - + local _new = _fuse.new local _bind = _fuse.bind local _clone = _fuse.clone local _import = _fuse.import - + local _Value = _fuse.Value local _Computed = _fuse.Computed local onClickState = _import(onClick, function() end) local textState = _import(text, "") - local themeState = _import(theme, Types.newThemeData( - 1, - false, - 1, - Font.fromEnum(Enum.Font.SourceSansSemibold), - Color3.fromHSV(0.8, 0.4, 0.8) - )) + local themeState = _import(theme, Types.newThemeData(1, false, 1, Font.fromEnum(Enum.Font.SourceSansSemibold), Color3.fromHSV(0.8, 0.4, 0.8))) local sound = maid:GiveTask(Instance.new("Sound")) sound.Volume = DEFAULT_VOLUME sound.SoundId = Sounds.ui_tap_variant_01 - local styles = _Computed(function(thm: ThemeData): {[Enums.ButtonStateType]: TextStyle} + local styles = _Computed(function(thm: ThemeData): { [Enums.ButtonStateType]: TextStyle } local textColor: Color3? if thm.IsDarkMode then - textColor = Util.getReadableColor( - thm.Color3, - if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.DARK_SURFACE - ) + textColor = Util.getReadableColor(thm.Color3, if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.DARK_SURFACE) else - textColor = Util.getReadableColor( - thm.Color3, - if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.LIGHT_SURFACE - ) + textColor = Util.getReadableColor(thm.Color3, if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.LIGHT_SURFACE) end assert(textColor) - textColor = Util.getElevatedColor( - textColor, - thm.Elevation, - thm.IsDarkMode - ) + textColor = Util.getElevatedColor(textColor, thm.Elevation, thm.IsDarkMode) local data = { - [Enums.ButtonStateType.Enabled] = Types.newTextStyle( - textColor, - 0, - textColor, - 1, - textColor, - 1 - ), + [Enums.ButtonStateType.Enabled] = Types.newTextStyle(textColor, 0, textColor, 1, textColor, 1), [Enums.ButtonStateType.Disabled] = Types.newTextStyle( (function(): Color3 if thm.IsDarkMode then - local h,_s,v = textColor:ToHSV() - return Util.getReadableColor( - Color3.fromHSV(h,0,v), - if thm.BackgroundColor3 then thm.BackgroundColor3 else Color3.new(0.15,0.15,0.15) - ) + local h, _s, v = textColor:ToHSV() + return Util.getReadableColor(Color3.fromHSV(h, 0, v), if thm.BackgroundColor3 then thm.BackgroundColor3 else Color3.new(0.15, 0.15, 0.15)) else - local h,_s,v = textColor:ToHSV() - return Util.getReadableColor( - Color3.fromHSV(h,0,v), - if thm.BackgroundColor3 then thm.BackgroundColor3 else Color3.new(0.85,0.85,0.85) - ) + local h, _s, v = textColor:ToHSV() + return Util.getReadableColor(Color3.fromHSV(h, 0, v), if thm.BackgroundColor3 then thm.BackgroundColor3 else Color3.new(0.85, 0.85, 0.85)) end end)(), DISABLE_TRANSPARENCY, @@ -121,30 +85,9 @@ function Interface.cfusion( textColor, 1 ), - [Enums.ButtonStateType.Focused] = Types.newTextStyle( - textColor, - 0, - textColor, - FOCUS_TRANSPARENCY, - textColor, - 1 - ), - [Enums.ButtonStateType.Hovered] = Types.newTextStyle( - textColor, - 0, - textColor, - HOVER_TRANSPARENCY, - textColor, - 1 - ), - [Enums.ButtonStateType.Pressed] = Types.newTextStyle( - textColor, - 0, - textColor, - PRESS_TRANSPARENCY, - textColor, - 1 - ), + [Enums.ButtonStateType.Focused] = Types.newTextStyle(textColor, 0, textColor, FOCUS_TRANSPARENCY, textColor, 1), + [Enums.ButtonStateType.Hovered] = Types.newTextStyle(textColor, 0, textColor, HOVER_TRANSPARENCY, textColor, 1), + [Enums.ButtonStateType.Pressed] = Types.newTextStyle(textColor, 0, textColor, PRESS_TRANSPARENCY, textColor, 1), } return data end, themeState) @@ -152,7 +95,7 @@ function Interface.cfusion( local button = Base( maid, onClickState, - textState, + textState, _Computed(function(t: ThemeData): Font return t.Font end, themeState), @@ -169,4 +112,4 @@ function Interface.cfusion( return button end -return Interface \ No newline at end of file +return Interface diff --git a/src/Config.luau b/src/Config.luau index 0f61c380..f5c33b27 100644 --- a/src/Config.luau +++ b/src/Config.luau @@ -14,7 +14,7 @@ return { }, Transparency = { Text = { - Disabled = 0.4 + Disabled = 0.4, }, Background = { Disabled = 0.7, @@ -22,5 +22,5 @@ return { Focused = 0.45, Pressed = 0.6, }, - } -} \ No newline at end of file + }, +} diff --git a/src/Enums.luau b/src/Enums.luau index e8356b24..8ae7a1bd 100644 --- a/src/Enums.luau +++ b/src/Enums.luau @@ -1,11 +1,7 @@ --strict -- this script was generated by nightcycle/pseudo-enum, do not manually edit -export type ButtonStateType = "Enabled" - | "Disabled" - | "Hovered" - | "Focused" - | "Pressed" +export type ButtonStateType = "Enabled" | "Disabled" | "Hovered" | "Focused" | "Pressed" local ButtonStateTypeList = { "Enabled", "Disabled", "Hovered", "Focused", "Pressed" } export type EnumName = "ButtonStateType" diff --git a/src/Sounds.luau b/src/Sounds.luau index db4e2d80..6b7f3448 100644 --- a/src/Sounds.luau +++ b/src/Sounds.luau @@ -38,5 +38,5 @@ return { notification_simple_02 = "rbxassetid://15530133223", navigation_backward_selection = "rbxassetid://15530108417", ui_lock = "rbxassetid://15530107845", - alert_error_01 = "rbxassetid://15530082764" -} \ No newline at end of file + alert_error_01 = "rbxassetid://15530082764", +} diff --git a/src/Types.luau b/src/Types.luau index 8628f13c..a1685fe9 100644 --- a/src/Types.luau +++ b/src/Types.luau @@ -9,22 +9,22 @@ export type ThemeData = { Color3: Color3, Font: Font, BackgroundColor3: Color3?, - Scale: number + Scale: number, } export type ImageData = { Image: string, RectOffset: Vector2, - RectSize: Vector2 + RectSize: Vector2, } export type Style = { BorderColor3: Color3, BorderTransparency: number, BackgroundColor3: Color3, - BackgroundTransparency: number + BackgroundTransparency: number, } export type TextStyle = { TextColor3: Color3, - TextTransparency: number + TextTransparency: number, } & Style -- Constants -- Variables @@ -33,24 +33,15 @@ export type TextStyle = { -- Class local Types = {} -function Types.newImageData( - image: string, - offset: Vector2?, - size: Vector2? -): ImageData +function Types.newImageData(image: string, offset: Vector2?, size: Vector2?): ImageData return { Image = image, RectOffset = offset or Vector2.zero, - RectSize = size or Vector2.zero + RectSize = size or Vector2.zero, } end -function Types.newStyle( - backgroundColor3: Color3, - backgroundTransparency: number, - borderColor3: Color3, - borderTransparency: number -): Style +function Types.newStyle(backgroundColor3: Color3, backgroundTransparency: number, borderColor3: Color3, borderTransparency: number): Style return { BackgroundColor3 = backgroundColor3, BackgroundTransparency = backgroundTransparency, @@ -59,14 +50,7 @@ function Types.newStyle( } end -function Types.newTextStyle( - textColor3: Color3, - textTransparency: number, - backgroundColor: Color3, - backgroundTransparency: number, - borderColor3: Color3, - borderTransparency: number -): TextStyle +function Types.newTextStyle(textColor3: Color3, textTransparency: number, backgroundColor: Color3, backgroundTransparency: number, borderColor3: Color3, borderTransparency: number): TextStyle return { TextColor3 = textColor3, TextTransparency = textTransparency, @@ -77,22 +61,15 @@ function Types.newTextStyle( } end -function Types.newThemeData( - elevation: number, - isDarkMode: boolean, - scale: number, - font: Font, - color3: Color3, - backgroundColor3: Color3? -): ThemeData +function Types.newThemeData(elevation: number, isDarkMode: boolean, scale: number, font: Font, color3: Color3, backgroundColor3: Color3?): ThemeData return { Color3 = color3, BackgroundColor3 = backgroundColor3, Elevation = elevation, IsDarkMode = isDarkMode, Font = font, - Scale = scale + Scale = scale, } end -return Types \ No newline at end of file +return Types diff --git a/src/Util.luau b/src/Util.luau index 983247a8..81f32044 100644 --- a/src/Util.luau +++ b/src/Util.luau @@ -17,8 +17,8 @@ local B_WEIGHT = 0.0722 local L_EXP = 2.4 local MIN_HEX_DIFFERENCE = 100 / 255 local DEFAULT_CONTRAST_RATIO = 4.5 -local BLACK_COLOR = Color3.new(0,0,0) -local WHITE_COLOR = Color3.new(1,1,1) +local BLACK_COLOR = Color3.new(0, 0, 0) +local WHITE_COLOR = Color3.new(1, 1, 1) local MAX_ELEVATION = 16 -- Variables -- References @@ -35,13 +35,13 @@ function getContrastRatio(textColor3: Color3, backgroundColor3: Color3): number end return R_WEIGHT * solveSpace(color.R) + G_WEIGHT * solveSpace(color.G) + B_WEIGHT * solveSpace(color.B) end - + local _fH, _fS, fV = textColor3:ToHSV() local _bH, _bS, bV = backgroundColor3:ToHSV() - + local fLum = getRelativeLuminance(textColor3) local bLum = getRelativeLuminance(backgroundColor3) - + local lighterRelativeLuminance: number local darkerRelativeLuminance: number if fV < bV then @@ -51,21 +51,17 @@ function getContrastRatio(textColor3: Color3, backgroundColor3: Color3): number lighterRelativeLuminance = fLum darkerRelativeLuminance = bLum end - + return (lighterRelativeLuminance + 0.05) / (darkerRelativeLuminance + 0.05) end -- Class local Util = {} -Util.DARK_SURFACE = Color3.new(0.15,0.15,0.15) -Util.LIGHT_SURFACE = Color3.new(0.85,0.85,0.85) +Util.DARK_SURFACE = Color3.new(0.15, 0.15, 0.15) +Util.LIGHT_SURFACE = Color3.new(0.85, 0.85, 0.85) -function Util.getIfReadable( - textColor3: Color3, - backgroundColor3: Color3, - minConstrastRatio: number? -): boolean +function Util.getIfReadable(textColor3: Color3, backgroundColor3: Color3, minConstrastRatio: number?): boolean minConstrastRatio = minConstrastRatio or DEFAULT_CONTRAST_RATIO assert(minConstrastRatio) local ratio = getContrastRatio(textColor3, backgroundColor3) @@ -73,29 +69,24 @@ function Util.getIfReadable( end -- https://github.com/alex-page/a11ycolor/blob/main/index.js -function Util.getReadableColor( - textColor3: Color3, - backgroundColor3: Color3, - minConstrastRatio: number? -): Color3 +function Util.getReadableColor(textColor3: Color3, backgroundColor3: Color3, minConstrastRatio: number?): Color3 minConstrastRatio = minConstrastRatio or DEFAULT_CONTRAST_RATIO assert(minConstrastRatio) - -- Check the ratio straight away, if it passes return the value as hex if Util.getIfReadable(textColor3, backgroundColor3, minConstrastRatio) then return textColor3 end - + -- Ratio didn't pass so we need to find the nearest color local isBlackContrast = Util.getIfReadable(BLACK_COLOR, backgroundColor3, minConstrastRatio) local isWhiteContrast = Util.getIfReadable(WHITE_COLOR, backgroundColor3, minConstrastRatio) - + local cH, cS, cV = textColor3:ToHSV() local minValue = 0 local maxValue = 1 local isDarkColor = false - + -- If black and white both pass on the background if isBlackContrast and isWhiteContrast then -- Change the min lightness if the color is light @@ -111,10 +102,10 @@ function Util.getReadableColor( else -- Colour doesn't meet contrast pass on black minValue = cV end - + -- The color to return local finalColor: Color3? - + -- Binary search until we find the colour that meets contrast local prevColor: Color3? while not finalColor do @@ -134,7 +125,7 @@ function Util.getReadableColor( else minValue = midValue end - + if prevColor == midColor then break end @@ -147,25 +138,13 @@ end function Util.getElevatedColor(color: Color3, elevation: number, isDarkMode: boolean): Color3 elevation = math.clamp(elevation, 0, MAX_ELEVATION) - local alpha = 1- CurveUtil.ease( - elevation / MAX_ELEVATION, - Enum.EasingStyle.Quad, - Enum.EasingDirection.In - ) + local alpha = 1 - CurveUtil.ease(elevation / MAX_ELEVATION, Enum.EasingStyle.Quad, Enum.EasingDirection.In) if isDarkMode then - return CurveUtil.lerp( - color, - Color3.new(1,1,1), - alpha*0.1 - ) + return CurveUtil.lerp(color, Color3.new(1, 1, 1), alpha * 0.1) else - return CurveUtil.lerp( - color, - Color3.new(1,1,1), - alpha*0.25 - ) + return CurveUtil.lerp(color, Color3.new(1, 1, 1), alpha * 0.25) end end -return Util \ No newline at end of file +return Util diff --git a/src/init.luau b/src/init.luau index 27d3eb70..db011924 100644 --- a/src/init.luau +++ b/src/init.luau @@ -12,4 +12,4 @@ local _Packages = _Package.Parent -- Class local Synthetic = {} -return Synthetic \ No newline at end of file +return Synthetic From 0de873f5448caba8c9220dd4b7907dd160936939 Mon Sep 17 00:00:00 2001 From: Nightcycle <77173389+nightcycle@users.noreply.github.com> Date: Wed, 6 Dec 2023 16:01:42 -0500 Subject: [PATCH 12/57] Added segmented buttons --- circle-left.png | Bin 0 -> 5477 bytes circle-right.png | Bin 0 -> 5200 bytes circle.png | Bin 0 -> 8034 bytes sourcemap.json | 2 +- src/Component/Button/Base.luau | 4 +- .../Button/Segmented/cfusion.story.luau | 90 +++ src/Component/Button/Segmented/init.luau | 566 ++++++++++++++++++ src/Config.luau | 2 +- src/Types.luau | 57 +- stylua.toml | 2 +- 10 files changed, 712 insertions(+), 11 deletions(-) create mode 100644 circle-left.png create mode 100644 circle-right.png create mode 100644 circle.png create mode 100644 src/Component/Button/Segmented/cfusion.story.luau create mode 100644 src/Component/Button/Segmented/init.luau diff --git a/circle-left.png b/circle-left.png new file mode 100644 index 0000000000000000000000000000000000000000..4a3259e34673fbce8aad8cd327b29f105e869ac2 GIT binary patch literal 5477 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 literal 0 HcmV?d00001 diff --git a/circle-right.png b/circle-right.png new file mode 100644 index 0000000000000000000000000000000000000000..37193bb40714492854a2bb1a6ecbda2120e9c3bb GIT binary patch literal 5200 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 RG7bF-+1c!}F5TvL>R+8A?>PVf literal 0 HcmV?d00001 diff --git a/circle.png b/circle.png new file mode 100644 index 0000000000000000000000000000000000000000..83261b22b08ab0135e3e7fdbeff05681a907bcf6 GIT binary patch literal 8034 zcma)hdpwj|)c<-OGnk2najj$~jeA5+p^F(sxfXIel}vQejYOpj^KdGaPDF(`Oyw3O zorF}3Bk77RN>L`2OOYWmjG1}2-p}v-`}YU)?7i1sYwhn|d+oK?I_b4~l`3^66#!IS zU7UOXaP*0TvLgB!iFrMNey}K?Rm-8YNv{tzNZTAe9RY48Pn+CCMs3O-mp`Kbrq@sX zVT}<*n*sF4T%8S+aNXpb}xDDKg6kTVodi)$bNm)f**P!gAzzAPK(pG1#BJ{Am zq(|yZgWmPq3JwkS|LE@@@nC-&l6SuSq5rN%XD6fQwS8gn0S4AE>-eWv(Gsz!?@Idk zOzE7U#@tmmhNaq!m!m&KG0l=_>7b}eN1iEeK0bE$gQYB%&!t0~7qvgsDp{!S=rC#8 z$xxh_>1<$Sq#%DhX8mVOI{ldScJMdCh-0&_e++e&NunEiv=by7e$W%5r58#ohwKfN z3e9K&4;EOZ>GjSnYFy?&)L3$;RKu0yt0r6G;I6{er$dGbdBVD^akTNuwl`>GgX96z zknFt>j8Z^g<0D9ZDb?-&{AXW{M=GAd!C}?#H;05H=R|XRo2^}&_Zv`7e5!X*`8ad& zQMob3-)Smr+!3cD_8%K)H^%!;<#CpC-m)P2YaLad6ipGwrm3}9P~f?{Bin6Uy}!}V zVX0wiJg;$?p~6``&Mg-F(GzxF-V^OCOm4RF+r{oMCYjENxh2;KJ3%6h^hSpp`Lw7c z7PD9(qMRBQPa<}F)(pNI9Zsbmo=_i= zU$k`0P2H~HrAmPYw|IF;^s85e{%2JtxkQSOE10-ZCvN_id_Im8`$|&IG{bJZ(t1o> zKc=|?7j*AE$@Z5_Oq5&FiNRO-&Vp_h>@p(D+A4G$*$M0sRsyeFu_i!^YfcCMEqt2( zy8yC}f!c07@NW{~mnUGfj~Vnf?g)-x=qD9(%9S=2ZWiocu5FBQz3)6@Pann7XCx|q zHVFwlN+O&Qxq0lCxGGN;oK+5^SuLT!t;bTSwdnA3%V);x@Xms#Kd`NHG2vEwk=!Ck zT|7Fr$^LV;-~b&9H^hWHaQ3d127>1-@VJ2U&W*`)EG1)`*3+?4BTN{Avo+lf1e@uQ zlmD95nxeeNngVO+;!Er3SPq(;r#U%SwCYZTC4sUo7~?y;fyofq6n4 zNp4rk2n(1zE!SiJ9J<95&pnh+Zn-*AA0ePkR4_C<2KLMCj^x?WiRt-5Mntz{TlF=7 zpV&XC5Y0-Tyxei)HErpLQBY@|6O)cF<|^_Pynn0-I5!^Wnl7Ye)6dss&|2udN2#38 zFKJPvBWY5B=6ig$7Z&Ebaa5k6A6gwOQYtvnIpgLQtNqh->EY){e8)beMFo;89Sp-| z#Lk8~Zf#ztXJnB>e4-g*hP(*_L&T!2j%6y0tsQ2rB36wTXDu z2YZC+OCn}oyGZ3Up!VMn2K8=X=htFIUK5v+u6AUIbj0!38+LJa&G1z%I!)p)u>X7} zwf4F_$J9W)%3W{=(|UmyIbEB0rPVXm_ypLA3koeh1#EG4d}OZwsFw=w+) ze)Ql=EsOZ7wN_fhfB8c8^a+ZLquO=A&sU*KZ4R{n_bM8x*D$;tIGXh@dB^DDpvagM ztPXbt>N$7Wi|+@Hv%QvB#4q2DX?7QVnJ-qbXrY^&qjKi#eatorlcvD+L-*SUYMPpN zdEj2ehGE;Uv=QbyEOIN6PTlQ+m)+EyoZYW5^03a4Y^6|kNpn(uHhlUo?2wJV-k0YI zvwW~N&X2M7E+uY>a4QSU-Rsx|lF-&0owPk_QCO}!{>Bgs^rp%r16F-L!%9{26L>7F zXROeYmKa70Q) zr&vP#IONU|EBN-5jNEPK3T=F$No^7<-kKzwVFqhl>e$oA)hDrUU(5JtX!WB`tD6%_ z{5Uhr*ah?v;YAiDhJ){M5-Ekf-)2gQNzc7&j6L!ZB_HrOoXh6ib;$c3ASV^TqI^GAi!{xrxFM%-mUj}u+wI=@}vZU*L3*SVh!IU3dm`xEzF zN}t2gki&+qSLI>-A*-*AlbEq{Lc8Qi^~Mn6ud_tqVh-jKEKr{Go=_sLhM0(U$Az!H zMd46o-os-F3@FvACx)n>#uAfvZ~vE^lE5QLdp{}5V1s#x%Pqez{@Xy7X}N+29mVf1 z3A*XT(yC7x!O%@#5&yj5e8E=O+u7;LgJ;+8q~TevsKrj;Ws8*{DoMz2`eNJ73U}wRghC;UH|-~3EmXP26N6+IF?d*YH5{%z&~U<6R~Qa8Mt#A z(_e;caDCE1k6+VezjVlJzW z){_P1ahQqsgM#99SSt(MY*<)SpyhQ0=a0}hTZ+TT znjdf%Ui?{Cdyx|HUbB;Ga{u?x-v;{|Bs)&|?IJU;%dYgxUwzU5->Yp0$eNk(YOpuOX)xlAqV zs}Ru5z&ZE43QTJ|@>Ehl;jEML&WBe>v6ifWJ9tf|=X&Vl9my7N8)gvtyC-sp=Vo9k zZvUmkY3^Evc~d$c7-zTX zxbRUh#Jn%|BmB(Z;IRBHGI}AU#1DH@47>hqR0p$L>$JE-R3cUmR*%j6h=pcw_A#>V zJ((vmlWOO3Ur>owHf-23bbvH32s@#&67A#muGv_UKX#!M9(?OG=V9Dx=MqTrgT37b zVg?D_ccEnRNSeJl+}dgcg1NW+-fz1KUq00a({h10 zcBE}!|NP;fp54VTPxdhcgjbS#W-4ZzV_q^PV&5}*R75zI=fP?+k&TNe5LoxTo`~{= zT~Y;N-v_?w!UNXTT|&JF0s;$y1+C7T7NeP6HFU0_RVo zO3dgsoReexz_jeSB;>=_fwwGq5ul0aG4Ug9^2i%!Ep$1uJ#Fid4&ZJLj+_DCq8A-60pMhHX?7Yf zvsd8Ck&77UI0%RmnTyxWs2(ia9Y)a7!vhRq+hHZ(4CQQimYap?4$noLXh?tOxSF2L zWZ{NpfTD+urUkjzdfBb`)W$FJa06M!AaFjcemGJ{2Md6(`o~nkl{tbsq+-jtwMzIu z#n6jDUa?vgcLU(Z>KK9|V0??@kh|#JSU%{zi@lK4OX5J-(<>U-pdaKcworzmb=k_| z1?<6PyRZ(4EkK1h4{b>!g$RJD&u%!QL3ARkYbi*h5HpbG?H}CZ&uBm) z;8VlW9~BC1i1EOzO8kd8nEqNXRp6|8s7;Un7F*>=Y>c1@32^8Sm1RI11`t~nfc{VH zxq%B83ZNxXx-;GnDKlSEC%4ARrlDE?vQ-3g5G;RBp?YkJk47OT3ty@R(7Wmx*pZZB zajLfbMn4Y3bZ4Ba1Q5Lvy{M%JucF7Y^eo!QWCN@%m!bkA^(yFv-9uXk(891m|K?H< zu?r%eeTpP({iF`P#}K^HVYaOC8GwTG|2LY7m?W~$ggO5=;s2{kde9vEt(EAP2!$fc zkwS}EQ$4O|jVtJA1_WTv(V;t835(4RuYHJEmky~3V#&;9Q-?tEqf0uZ#Y!`v)!>T(f43Q8dr96cxliKqtkCzhyI17N8bsyzbSUrJjB`;cZUF9SM86@e(|NE)JP5O)VK;H;IU4<4RUIq~pa=@bmKv5?98 zK~T3EiEp|;8$N9!Gs6^svtGYpKZ2!v@G?m-HTLvMTPfPcfy0{Z3{_0=F9KT51f?$Vl9Pm2`i|{r6(DWRRAguHqFt}~M4_bO3qcCCch>I2(Cq_aE9k29l>&5A; z-`$qYmLHpcDJ3A>i=L$Q$Qg$#@RS}XN8nG_Y3O%f2cJ3-*yjc=zmeus2xO_RKY7;V z?(@dW+6O|+g%WiC^1TLqp4FIa3|@yR7bEr+Nui_XNCG`T)4Bqs{fh*lD^eL4@$ZIm zX~ZA-xSHk6c>w;lrYqNY{+8sC7Bcc$n^=ose2@9VpJH_~eX&RK#QU?=;K}e-HxX^^ zdia!hLTM$AoCbYe2wHPm12X&V?PGnDVJ4S<(yj^4EXFfIhH>X+7#gp&Rpw4d@x-iW6{CY~bQ|y{$7F>^V(>O=-}la& z&U9keuXr-_KC2vexa+(Qu58i`(X~2`xNiTL-zwiWesI6LKl~SxISu{@f3bViJpk?* zszE`PRG6EneI4?6;mwFo{kr?h9kn&eRzaxgD45ZnDvW+nwdf*HUD zmiF^VQFA|9N_ouxF2%Vfc&<1R#eI%i08Q(5k23rbF6b!O?Y!N}3%ri2A)g`4^9zt~ zx=rOw@k{d$k|z3@|DN#U&&k)dYyGePo>8?eZLIqmTJ;^OD60CNsTvAa|DB+f1iVcJNRp%Iox6EG6I2hUCrsfRl2= zWkvZJtpLmpDM-B6n)URQCk&Sz)xfbLzihEi;Ro%jZQ2~&<8u_TD_UGcbMe8__HBm0 zWUCA-;WAZ?7r73D*WKS!|Kgb}#+3W!TQ!mQprdx%B)nN}>Rbscn-qahzxi$cRJ#G; zIgxaFJFzZSS**Lc#W+Tz<@*a?7@A^#od@5%Ag1L{c1(8h3wJAWcjz`iP+WiDa48dsB*fsf=AnT z7LI0WLM{Jn>%O65WNzvS)fZ!fMk}M!;ONM)eLhSmJdzpe zWQ+0>Na;q?cod1Oyg8g46dKfLiFSUPG^pC%QkSsnu6!EP@?1@5T5mO(5gv@Za!aOV zg=AU&7)kJpLpUrP4VUkXeuwMk&zDu%@Js4wMAJZ}WVXJfbsw4ghsp|HxJ(zGM&V$? ze>dLgOnSUP-REl5AMPrXL?{!-2TE!ZZe=h3|H97LJzdlLbgpiY&%zL&0dop;YEx; z7<|2kBtLi+=5ck87lD%@(+r0V5w&G*b!;TUX5-!RPIUURu8@$Y_U6d{#Y1x4RNW>Z)c;&W6beoGV>I;#>&-Fb0ucuQ0RQM zQ(u1G1^hQ>F$HNMZS(zQM$!NSEHD#|COv%r?mOy6`8hR)6339 zwW=<#D7EHYX!R&MJcOn5|&stA0Iq{QD!N`2Qc!xK+7tDubYd2g(!%}OOWZ@sUAiZZ^_rZ>Qz z!uje$SF2;E5-y7HMh#U$YBi*0Mp)R<9Z-gs$c|^A{JAWCk`)wZ6>s>UZu1bGQ5!n* z65hgW1@21gPmB_oE~j9Q8K^EURddg+k#Z z?p-g4{Eu@2)pX)wWldpNv`JjcE3Fj?oq6sRwAjU#W7A}_eX!n+J$9~E@A2RPIrKVu zj5TIS=D}hkj61(s$!R_Fy#gmIBx%pJiTkBG7BIa_XL+^5n&ik#*|7?zlkAVL7&rR0 zCf}vOo;4F+t-@zbE)I(G=6ra#cG5un{by9NHf&R^7ga_}4p-}$tBjryFqX;M-YXfq zqC}>?=4mJ4jlNW6&Yh5=L5ZeV9w}B{gIHOg1kIfc@vG4ws?11o2i3kFvv4n!_}mg# zsJiF`i{^@=Y$#y+^dv`*rFoM0d~B2baY+WMHvO5unMsdtTgX&LN9vuPb%(LYW)=mK zTuyTCMOvBRtF@1QZ}=z;9BQv`?q|U~GebPLU_A@}xDe8lrhrO}ys1lp61$nYlkU~! zO2V7Uzu0+Cxr~w&D63v-tag(41$s{=Uvwtxj0$#4)xivLZ;EcaLWTOvw7^fRGTC_T z0(Mpkc#-_D#p)%Kyh47&#oXtp!uG`5kGWqxLyJ!ijga4Nbuc`OF3fW(CB2IAyVf+hacV-9FZGSOxkPy+w2YUY5W7@C!v#<+!t}%k#YpF4LfWe44ck;k zZl=nEt3!^-KR(g#o`Z_KUmfd<)J{{D`>H = ColdFusion.State +type ValueState = ColdFusion.ValueState +type CanBeState = ColdFusion.CanBeState +type TextStyle = Types.TextStyle +type ToggleTextStyle = Types.ToggleTextStyle +type ImageData = Types.ImageData +type ThemeData = Types.ThemeData +type OptionData = Types.OptionData +type Signal = Signal.Signal + +-- Constants +local HEIGHT_DP = 40 +local OUTLINE_WIDTH_DP = 1 +local LABEL_ALIGNMENT = Enum.TextXAlignment.Center +local MIN_LEFT_RIGHT_PADDING_DP = 12 +local ELEMENT_SEPARATION_PADDING_DP = 8 +local TARGET_SIZE_DP = 48 +local MAX_BUTTON_COUNT = 5 +local ICON_SIZE_DP = 18 +local DEFAULT_VOLUME = Config.Sound.Volume +local HOVER_TRANSPARENCY = Config.Transparency.Background.Hovered +local FOCUS_TRANSPARENCY = Config.Transparency.Background.Focused +local PRESS_TRANSPARENCY = Config.Transparency.Background.Pressed +local DISABLE_TRANSPARENCY = Config.Transparency.Text.Disabled +local CIRCLE_IMAGE_RECT = Rect.new(256,256,256, 256) +local RIGHT_CIRCLE_IMAGE = "rbxassetid://15562060748" +local LEFT_CIRCLE_IMAGE = "rbxassetid://15562057345" +local CENTER_IMAGE = "rbxassetid://14846394635" + +-- Variables +-- References +-- Private Functions + +function new( + maid: Maid, + options: CanBeState<{[number]: OptionData}>, + isMultiSelect: CanBeState, + styles: CanBeState<{[Enums.ButtonStateType]: ToggleTextStyle}>, + scale: CanBeState, + font: CanBeState, + density: CanBeState, + sound: CanBeState +): Frame + + local _fuse = ColdFusion.fuse(maid) + + local _new = _fuse.new + local _bind = _fuse.bind + local _clone = _fuse.clone + local _import = _fuse.import + + local _Value = _fuse.Value + local _Computed = _fuse.Computed + + local optionsState: State<{[number]: OptionData}> = _import( + options, + {} + ) + + local isMultiSelectState: State = _import( + isMultiSelect, + false + ) + + local stylesState: State<{[Enums.ButtonStateType]: ToggleTextStyle}> = _import( + styles, + {} + ) + + local soundState: State = _import(sound, nil :: Sound?) + + local scaleState: State = _import(scale, 1) + local densityState: State = _Computed(function(d: number) + return math.clamp(d, -3, 0) + end, _import(density, 0)) + + local fontState: State = _import(font, Font.fromEnum(Enum.Font.SourceSansSemibold)) + + local heightState = _Computed(function(s: number, d: number): number + return s*(HEIGHT_DP+(d*4)) + end, scaleState, densityState) + + local ratioState = _Computed(function(d: number): number + return 3 * ((HEIGHT_DP-(d*4))/HEIGHT_DP) + end, densityState) + + local inst = _new("Frame")({ + Size = _Computed(function(h: number): UDim2 + return UDim2.fromOffset(0, h) + end, heightState), + AutomaticSize = Enum.AutomaticSize.X, + BackgroundTransparency = 1, + Children = { + _new("UIListLayout")({ + Padding = UDim.new(0, 0), + SortOrder = Enum.SortOrder.LayoutOrder, + FillDirection = Enum.FillDirection.Horizontal, + HorizontalFlex = Enum.UIFlexAlignment.Fill, + VerticalFlex = Enum.UIFlexAlignment.None, + ItemLineAlignment = Enum.ItemLineAlignment.Center, + VerticalAlignment = Enum.VerticalAlignment.Center, + HorizontalAlignment = Enum.HorizontalAlignment.Center, + }), + -- _new("UIGridLayout")({ + -- FillDirection = Enum.FillDirection.Horizontal, + -- FillDirectionMaxCells = 100000, + -- SortOrder = Enum.SortOrder.LayoutOrder, + -- StartCorner = Enum.StartCorner.TopLeft, + -- CellPadding = UDim2.fromScale(0,0), + -- CellSize = _Computed(function(options: {[number]: OptionData}): UDim2 + -- return UDim2.fromScale(1/math.min(#options, MAX_BUTTON_COUNT), 1) + -- end, optionsState) + -- }), + _new("UICorner")({ + CornerRadius = UDim.new(1, 0), + }), + _new("UIStroke")({ + ApplyStrokeMode = Enum.ApplyStrokeMode.Border, + Color = _Computed(function(styles: {[Enums.ButtonStateType]: ToggleTextStyle}): Color3 + return styles[Enums.ButtonStateType.Enabled].Unselected.BorderColor3 + end, stylesState), + LineJoinMode = Enum.LineJoinMode.Round, + Thickness = _Computed(function(s: number): number + return math.max(s * OUTLINE_WIDTH_DP * 1, 1) + end, scaleState), + Transparency = _Computed(function(styles: {[Enums.ButtonStateType]: ToggleTextStyle}): number + return styles[Enums.ButtonStateType.Enabled].Unselected.BorderTransparency + end, stylesState), + }), + _new("UISizeConstraint")({ + MaxSize = Vector2.new(math.huge, math.huge), + MinSize = _Computed(function(s: number): Vector2 + return Vector2.new(s * MIN_LEFT_RIGHT_PADDING_DP * 2, 0) + end, scaleState), + }), + } + }) :: Frame + + local deselectAll = maid:GiveTask(Signal.new()) + + + for i=1, MAX_BUTTON_COUNT do + local optionDataState: State = _Computed(function(options: {[number]: OptionData}): OptionData? + return options[i] + end, optionsState) + + local backgroundImageState = _Computed(function(options: {[number]: OptionData}): string + if #options == i then + return RIGHT_CIRCLE_IMAGE + elseif i == 1 then + return LEFT_CIRCLE_IMAGE + else + return CENTER_IMAGE + end + end, optionsState) + local isEnabledState = _Computed(function(optionData: OptionData?): boolean + return if optionData then not optionData.Disabled else false + end, optionDataState) + + local onClickState = _Computed(function(optionData: OptionData?): (boolean) -> () + return if optionData then optionData.OnSelect else function(isSelected: boolean) end + end, optionDataState) + + local isFocusedState = _Value(false) + local isPressedState = _Value(false) + local isHoveredState = _Value(false) + local clickCount = _Value(0) + local isInitiallySelected = _Computed(function(optionData: OptionData?) + clickCount:Set(0) + return if optionData then not optionData.IsInitiallySelected else false + end, optionDataState) + + local isSelectedState = _Computed(function(count: number, initial: boolean): boolean + return if count % 2 == 0 then initial else not initial + end, clickCount, isInitiallySelected) + + maid:GiveTask(deselectAll:Connect(function(j: number) + if j ~= i then + if isSelectedState:Get() then + clickCount:Set(clickCount:Get()+1) + end + end + end)) + + local currentStateState = _Computed(function(isEnabled: boolean, isFocused: boolean, isPressed: boolean, isHovered: boolean): Enums.ButtonStateType + if isEnabled then + if isPressed then + return Enums.ButtonStateType.Pressed + else + if isHovered then + return Enums.ButtonStateType.Hovered + else + if isFocused then + return Enums.ButtonStateType.Focused + else + return Enums.ButtonStateType.Enabled + end + end + end + else + return Enums.ButtonStateType.Disabled + end + end, isEnabledState, isFocusedState, isPressedState, isHoveredState) :: State + + + local iconState = _Computed(function(optionData: OptionData?, isSelected: boolean): ImageData? + return if optionData then if isSelected then optionData.SelectedIcon else optionData.Icon else nil + end, optionDataState, isSelectedState) + + local textState = _Computed(function(optionData: OptionData?, isSelected: boolean): string + return if optionData then if isSelected then optionData.SelectedText else optionData.Text else "" + end, optionDataState, isSelectedState) + + local currentStyleState = _Computed(function( + state: Enums.ButtonStateType, + isSelected: boolean, + styles: { [Enums.ButtonStateType]: ToggleTextStyle } + ): TextStyle + local toggleStyle = styles[state] + assert(toggleStyle ~= nil, `no style for {state}`) + if isSelected then + return toggleStyle.Selected + else + return toggleStyle.Unselected + end + end, currentStateState, isSelectedState, stylesState) + + local barSizeState = _Computed(function(s: number): UDim2 + return UDim2.new(0, s*OUTLINE_WIDTH_DP,1,0) + end, scaleState) + + _new("Frame")({ + Visible = _Computed(function(data: OptionData?): boolean + return i > 1 and data ~= nil + end, optionDataState), + LayoutOrder = i - 0.5, + Size = barSizeState, + BorderSizePixel = 0, + BackgroundTransparency = _Computed(function(styleList: {[Enums.ButtonStateType]: ToggleTextStyle}): number + return styleList[Enums.ButtonStateType.Enabled].Unselected.BorderTransparency + end, stylesState), + BackgroundColor3 = _Computed(function(styleList: {[Enums.ButtonStateType]: ToggleTextStyle}): Color3 + return styleList[Enums.ButtonStateType.Enabled].Unselected.BorderColor3 + end, stylesState), + Parent = inst, + }) + + _new("ImageButton")({ + Visible = _Computed(function(data: OptionData?): boolean + return data ~= nil + end, optionDataState), + Size = _Computed(function(options: {[number]: OptionData}, barSize: UDim2): UDim2 + local buttonCount = #options + local avgBarReduction = barSize.X.Offset * (buttonCount-1) / buttonCount + return UDim2.new(1/buttonCount,-avgBarReduction,1,0) + end, optionsState, barSizeState), + LayoutOrder = i, + Parent = inst, + BackgroundTransparency = 1, + Image = backgroundImageState, + ImageTransparency = _Computed(function(style: TextStyle): number + return style.BackgroundTransparency + end, currentStyleState), + ImageColor3 = _Computed(function(style: TextStyle): Color3 + return style.BackgroundColor3 + end, currentStyleState), + SliceCenter = CIRCLE_IMAGE_RECT, + SliceScale = 1, + ScaleType = Enum.ScaleType.Slice, + AutomaticSize = Enum.AutomaticSize.None, + Events = { + Activated = function() + if isEnabledState:Get() == false then + return + end + local onClick = onClickState:Get() + local count = clickCount:Get() + 1 + clickCount:Set(count) + local initialSelect: boolean = isInitiallySelected:Get() + + local s = soundState:Get() + if s then + SoundService:PlayLocalSound(s) + end + + if isMultiSelectState:Get() == false then + deselectAll:Fire(i) + end + + if count%2 == 0 then + onClick(initialSelect) + else + onClick(not initialSelect) + end + end, + MouseButton1Down = function(x: number, y: number) + if isEnabledState:Get() == false then + return + end + isPressedState:Set(true) + end, + MouseButton1Up = function(x: number, y: number) + if isEnabledState:Get() == false then + return + end + isPressedState:Set(false) + end, + MouseEnter = function() + isHoveredState:Set(true) + end, + MouseLeave = function() + isHoveredState:Set(false) + end, + SelectionGained = function() + isFocusedState:Set(true) + end, + SelectionLost = function() + isFocusedState:Set(false) + end, + }, + Children = { + _new("UIAspectRatioConstraint")({ + AspectRatio = ratioState, + AspectType = Enum.AspectType.ScaleWithParentSize, + DominantAxis = Enum.DominantAxis.Height, + }), + _new("UIListLayout")({ + Padding = _Computed(function(s: number): UDim + return UDim.new(0, s * ELEMENT_SEPARATION_PADDING_DP) + end, scaleState), + SortOrder = Enum.SortOrder.LayoutOrder, + FillDirection = Enum.FillDirection.Horizontal, + ItemLineAlignment = Enum.ItemLineAlignment.Center, + VerticalAlignment = Enum.VerticalAlignment.Center, + HorizontalAlignment = Enum.HorizontalAlignment.Center, + }), + _new("TextLabel")({ + Text = textState, + Visible = _Computed(function(txt: string): boolean + return txt:len() > 0 + end, textState), + TextScaled = true, + TextXAlignment = LABEL_ALIGNMENT, + TextYAlignment = Enum.TextYAlignment.Center, + BackgroundTransparency = 1, + AutomaticSize = Enum.AutomaticSize.X, + FontFace = fontState, + LayoutOrder = 2, + TextColor3 = _Computed(function(style: TextStyle): Color3 + return style.TextColor3 + end, currentStyleState), + TextTransparency = _Computed(function(style: TextStyle): number + return style.TextTransparency + end, currentStyleState), + + SizeConstraint = Enum.SizeConstraint.RelativeYY, + + Size = _Computed(function(s: number): UDim2 + return UDim2.fromScale(0, 1) --s * ICON_SIZE_DP) + end, scaleState), + }), + _new("ImageLabel")({ + Name = "Icon", + LayoutOrder = 1, + BackgroundTransparency = 1, + Visible = _Computed(function(icon: ImageData?): boolean + return icon ~= nil + end, iconState), + Image = _Computed(function(icon: ImageData?): string + return if icon then icon.Image else "" + end, iconState), + ImageColor3 = _Computed(function(icon: ImageData?, style: TextStyle?): Color3 + return if icon and style then style.TextColor3 else Color3.new(1, 1, 1) + end, iconState, currentStyleState), + ImageRectOffset = _Computed(function(icon: ImageData?): Vector2 + return if icon then icon.ImageRectOffset else Vector2.zero + end, iconState), + ImageRectSize = _Computed(function(icon: ImageData?): Vector2 + return if icon then icon.ImageRectSize else Vector2.zero + end, iconState), + ImageTransparency = _Computed(function(icon: ImageData?, style: TextStyle?): number + return if icon and style then style.TextTransparency else 1 + end, iconState, currentStyleState), + SizeConstraint = Enum.SizeConstraint.RelativeYY, + Size = _Computed(function(s: number): UDim2 + return UDim2.fromScale(1, 1) + -- return UDim2.fromOffset(s * ICON_SIZE_DP, s * ICON_SIZE_DP) + end, scaleState), + }), + -- _new("UICorner")({ + -- CornerRadius = UDim.new(1, 0), + -- }), + _new("UISizeConstraint")({ + MaxSize = Vector2.new(math.huge, math.huge), + MinSize = _Computed(function(s: number): Vector2 + return Vector2.new(s * TARGET_SIZE_DP, 0) + end, scaleState), + }), + _new("UIPadding")({ + PaddingLeft = _Computed(function(s: number): UDim + return UDim.new(0, s * (MIN_LEFT_RIGHT_PADDING_DP+ELEMENT_SEPARATION_PADDING_DP)) + end, scaleState), + PaddingRight = _Computed(function(s: number): UDim + return UDim.new(0, s * (MIN_LEFT_RIGHT_PADDING_DP+ELEMENT_SEPARATION_PADDING_DP)) + end, scaleState), + PaddingTop = _Computed(function(s: number, h: number): UDim + return UDim.new(0, (h - s *ICON_SIZE_DP)/2) + end, scaleState, heightState), + PaddingBottom = _Computed(function(s: number, h: number): UDim + return UDim.new(0, (h - s *ICON_SIZE_DP)/2) + end, scaleState, heightState), + }), + } + }) + end + + return inst +end +-- Class +local Interface = {} + +function Interface.cfusion( + options: CanBeState<{[number]: OptionData}>, + isMultiSelect: CanBeState, + theme: CanBeState, + density: CanBeState +): Frame + local maid = Maid.new() + + local _fuse = ColdFusion.fuse(maid) + + local _new = _fuse.new + local _bind = _fuse.bind + local _clone = _fuse.clone + local _import = _fuse.import + + local _Value = _fuse.Value + local _Computed = _fuse.Computed + + local themeState = _import(theme, Types.newThemeData(1, false, 1, Font.fromEnum(Enum.Font.SourceSansSemibold), Color3.fromHSV(0.8, 0.4, 0.8))) + + local sound = maid:GiveTask(Instance.new("Sound")) + sound.Volume = DEFAULT_VOLUME + sound.SoundId = Sounds.ui_tap_variant_01 + + local styles = _Computed(function(thm: ThemeData): { [Enums.ButtonStateType]: ToggleTextStyle } + + local unselectedColor = thm.Color3 + local selectedColor = thm.SelectionColor3 + + local selectedTextColor: Color3 + local unselectedTextColor: Color3 + + if thm.IsDarkMode == false then + selectedTextColor = Util.DARK_SURFACE --Util.getReadableColor(Util.DARK_SURFACE, selectedColor) + unselectedTextColor = Util.DARK_SURFACE --Util.getReadableColor(Util.DARK_SURFACE, unselectedColor) + else + selectedTextColor = Util.LIGHT_SURFACE --Util.getReadableColor(Util.LIGHT_SURFACE, selectedColor) + unselectedTextColor = Util.LIGHT_SURFACE --Util.getReadableColor(Util.LIGHT_SURFACE, unselectedColor) + end + + selectedColor = Util.getReadableColor(selectedColor, selectedTextColor) + unselectedColor = Util.getReadableColor(unselectedColor, unselectedTextColor) + + unselectedColor = Util.getElevatedColor(unselectedColor, thm.Elevation, thm.IsDarkMode) + selectedColor = Util.getElevatedColor(selectedColor, thm.Elevation, thm.IsDarkMode) + + local selectedBorderColor = selectedTextColor + local unselectedBorderColor = unselectedTextColor + + local data = { + [Enums.ButtonStateType.Enabled] = Types.newToggleTextStyle( + Types.newTextStyle(selectedTextColor, 0, selectedColor, 0.35, selectedBorderColor, 0), + Types.newTextStyle(unselectedTextColor, 0, unselectedColor, 1, unselectedBorderColor, 0) + ), + [Enums.ButtonStateType.Disabled] = Types.newToggleTextStyle( + Types.newTextStyle( + (function(): Color3 + if thm.IsDarkMode then + local h, _s, v = selectedTextColor:ToHSV() + return Util.getReadableColor(Color3.fromHSV(h, 0, v), if thm.BackgroundColor3 then thm.BackgroundColor3 else Color3.new(0.15, 0.15, 0.15)) + else + local h, _s, v = unselectedTextColor:ToHSV() + return Util.getReadableColor(Color3.fromHSV(h, 0, v), if thm.BackgroundColor3 then thm.BackgroundColor3 else Color3.new(0.85, 0.85, 0.85)) + end + end)(), + DISABLE_TRANSPARENCY, + selectedColor, + 1, + selectedBorderColor, + 1 + ), + Types.newTextStyle( + (function(): Color3 + if thm.IsDarkMode then + local h, _s, v = selectedTextColor:ToHSV() + return Util.getReadableColor(Color3.fromHSV(h, 0, v), if thm.BackgroundColor3 then thm.BackgroundColor3 else Color3.new(0.15, 0.15, 0.15)) + else + local h, _s, v = unselectedTextColor:ToHSV() + return Util.getReadableColor(Color3.fromHSV(h, 0, v), if thm.BackgroundColor3 then thm.BackgroundColor3 else Color3.new(0.85, 0.85, 0.85)) + end + end)(), + DISABLE_TRANSPARENCY, + unselectedColor, + 1, + unselectedBorderColor, + 1 + ) + ), + [Enums.ButtonStateType.Focused] = Types.newToggleTextStyle( + Types.newTextStyle(selectedTextColor, 0, selectedColor, FOCUS_TRANSPARENCY, selectedBorderColor, 0), + Types.newTextStyle(unselectedTextColor, 0, unselectedColor, FOCUS_TRANSPARENCY, unselectedBorderColor, 0) + ), + [Enums.ButtonStateType.Hovered] = Types.newToggleTextStyle( + Types.newTextStyle(selectedTextColor, 0, selectedColor, HOVER_TRANSPARENCY, selectedBorderColor, 0), + Types.newTextStyle(unselectedTextColor, 0, unselectedColor, HOVER_TRANSPARENCY, unselectedBorderColor, 0) + ), + [Enums.ButtonStateType.Pressed] = Types.newToggleTextStyle( + Types.newTextStyle(selectedTextColor, 0, selectedColor, PRESS_TRANSPARENCY, selectedBorderColor, 0), + Types.newTextStyle(unselectedTextColor, 0, unselectedColor, PRESS_TRANSPARENCY, unselectedBorderColor, 0) + ), + } + + return data + + end, themeState) + + local buttonRow = new( + maid, + options, + isMultiSelect, + styles, + _Computed(function(t: ThemeData): number + return t.Scale + end, themeState), + _Computed(function(t: ThemeData): Font + return t.Font + end, themeState), + density, + sound + ) + maid.bind(buttonRow) + return buttonRow +end + +return Interface diff --git a/src/Config.luau b/src/Config.luau index f5c33b27..0bf5d69a 100644 --- a/src/Config.luau +++ b/src/Config.luau @@ -14,7 +14,7 @@ return { }, Transparency = { Text = { - Disabled = 0.4, + Disabled = 0.6, }, Background = { Disabled = 0.7, diff --git a/src/Types.luau b/src/Types.luau index a1685fe9..f93bde74 100644 --- a/src/Types.luau +++ b/src/Types.luau @@ -7,14 +7,15 @@ export type ThemeData = { Elevation: number, IsDarkMode: boolean, Color3: Color3, + SelectionColor3: Color3, Font: Font, BackgroundColor3: Color3?, Scale: number, } export type ImageData = { Image: string, - RectOffset: Vector2, - RectSize: Vector2, + ImageRectOffset: Vector2, + ImageRectSize: Vector2, } export type Style = { BorderColor3: Color3, @@ -26,6 +27,19 @@ export type TextStyle = { TextColor3: Color3, TextTransparency: number, } & Style +export type ToggleTextStyle = { + Selected: TextStyle, + Unselected: TextStyle +} +export type OptionData = { + Text: string, + Icon: ImageData?, + Disabled: boolean, + IsInitiallySelected: boolean, + SelectedText: string, + SelectedIcon: ImageData?, + OnSelect: (isSelected: boolean) -> (), +} -- Constants -- Variables -- References @@ -33,11 +47,31 @@ export type TextStyle = { -- Class local Types = {} -function Types.newImageData(image: string, offset: Vector2?, size: Vector2?): ImageData +function Types.newOptionData( + onSelect: (isSelected: boolean) -> (), + disabled: boolean, + isInitiallySelected: boolean, + text: string, + icon: ImageData?, + selectedText: string?, + selectedIcon: ImageData? +): OptionData + return { + Text = text, + Icon = icon, + Disabled = disabled, + SelectedText = selectedText or text, + SelectedIcon = selectedIcon or icon, + IsInitiallySelected = isInitiallySelected, + OnSelect = onSelect, + } +end + +function Types.newImageData(image: string, rectOffset: Vector2?, rectSize: Vector2?): ImageData return { Image = image, - RectOffset = offset or Vector2.zero, - RectSize = size or Vector2.zero, + ImageRectOffset = rectOffset or Vector2.zero, + ImageRectSize = rectSize or Vector2.zero, } end @@ -61,9 +95,20 @@ function Types.newTextStyle(textColor3: Color3, textTransparency: number, backgr } end -function Types.newThemeData(elevation: number, isDarkMode: boolean, scale: number, font: Font, color3: Color3, backgroundColor3: Color3?): ThemeData +function Types.newToggleTextStyle( + selected: TextStyle, + unselected: TextStyle +): ToggleTextStyle + return { + Selected = selected, + Unselected = unselected + } +end + +function Types.newThemeData(elevation: number, isDarkMode: boolean, scale: number, font: Font, color3: Color3, backgroundColor3: Color3?, selectionColor3: Color3?): ThemeData return { Color3 = color3, + SelectionColor3 = selectionColor3 or color3, BackgroundColor3 = backgroundColor3, Elevation = elevation, IsDarkMode = isDarkMode, diff --git a/stylua.toml b/stylua.toml index a4a0d2f3..c6eefb22 100644 --- a/stylua.toml +++ b/stylua.toml @@ -1,4 +1,4 @@ -column_width = 200 +column_width = 140 line_endings = "Unix" indent_type = "Tabs" indent_width = 4 From 5baaecd871572327ce5d108b7933c2b652df82dd Mon Sep 17 00:00:00 2001 From: Nightcycle <77173389+nightcycle@users.noreply.github.com> Date: Wed, 6 Dec 2023 16:03:18 -0500 Subject: [PATCH 13/57] Updated stylua --- src/Component/Button/Base.luau | 146 ++++++---- .../Button/ElevatedButton/cfusion.story.luau | 31 ++- src/Component/Button/ElevatedButton/init.luau | 29 +- .../Button/ExtendedFAB/cfusion.story.luau | 31 ++- src/Component/Button/ExtendedFAB/init.luau | 29 +- src/Component/Button/FAB/cfusion.story.luau | 19 +- src/Component/Button/FAB/init.luau | 28 +- .../Button/FilledButton/cfusion.story.luau | 31 ++- src/Component/Button/FilledButton/init.luau | 29 +- .../FilledIconButton/cfusion.story.luau | 19 +- .../Button/FilledIconButton/init.luau | 28 +- .../Button/IconButton/cfusion.story.luau | 19 +- src/Component/Button/IconButton/init.luau | 65 ++++- .../Button/OutlinedButton/cfusion.story.luau | 31 ++- src/Component/Button/OutlinedButton/init.luau | 68 ++++- .../OutlinedIconButton/cfusion.story.luau | 19 +- .../Button/OutlinedIconButton/init.luau | 67 ++++- .../Button/Segmented/cfusion.story.luau | 75 ++--- src/Component/Button/Segmented/init.luau | 256 +++++++++++------- .../Button/TextButton/cfusion.story.luau | 31 ++- src/Component/Button/TextButton/init.luau | 66 ++++- src/Types.luau | 37 ++- src/Util.luau | 6 +- stylua.toml | 4 +- 24 files changed, 865 insertions(+), 299 deletions(-) diff --git a/src/Component/Button/Base.luau b/src/Component/Button/Base.luau index 764df90b..4f6333e2 100644 --- a/src/Component/Button/Base.luau +++ b/src/Component/Button/Base.luau @@ -64,32 +64,47 @@ return function( local isFocusedState = _Value(false) local isPressedState = _Value(false) local isHoveredState = _Value(false) - local currentStateState = _Computed(function(isEnabled: boolean, isFocused: boolean, isPressed: boolean, isHovered: boolean): Enums.ButtonStateType - if isEnabled then - if isPressed then - return Enums.ButtonStateType.Pressed - else - if isHovered then - return Enums.ButtonStateType.Hovered + local currentStateState = _Computed( + function( + isEnabled: boolean, + isFocused: boolean, + isPressed: boolean, + isHovered: boolean + ): Enums.ButtonStateType + if isEnabled then + if isPressed then + return Enums.ButtonStateType.Pressed else - if isFocused then - return Enums.ButtonStateType.Focused + if isHovered then + return Enums.ButtonStateType.Hovered else - return Enums.ButtonStateType.Enabled + if isFocused then + return Enums.ButtonStateType.Focused + else + return Enums.ButtonStateType.Enabled + end end end + else + return Enums.ButtonStateType.Disabled end - else - return Enums.ButtonStateType.Disabled - end - end, isEnabledState, isFocusedState, isPressedState, isHoveredState) :: State + end, + isEnabledState, + isFocusedState, + isPressedState, + isHoveredState + ) :: State local stylesState = _import(styles, {}) :: any - local currentStyleState = _Computed(function(state: Enums.ButtonStateType, styles: { [Enums.ButtonStateType]: TextStyle }): TextStyle - local style = styles[state] - assert(style ~= nil, `no style for {state}`) - return style - end, currentStateState, stylesState) + local currentStyleState = _Computed( + function(state: Enums.ButtonStateType, styles: { [Enums.ButtonStateType]: TextStyle }): TextStyle + local style = styles[state] + assert(style ~= nil, `no style for {state}`) + return style + end, + currentStateState, + stylesState + ) local onClickState = _import(onClick, function() end) local textState = _import(text, "") @@ -117,14 +132,28 @@ return function( runMaid:GiveTask(RunService.RenderStepped:Connect(function(deltaTime: number) alpha += deltaTime / 0.6 - local moveAlpha = 1 - CurveUtil.ease(1 - math.clamp(alpha / 0.5, 0, 1), Enum.EasingStyle.Quad, Enum.EasingDirection.In) - local fadeAlpha = CurveUtil.ease(math.clamp((alpha - 0.1) / 0.7, 0, 1), Enum.EasingStyle.Quad, Enum.EasingDirection.In) + local moveAlpha = 1 + - CurveUtil.ease( + 1 - math.clamp(alpha / 0.5, 0, 1), + Enum.EasingStyle.Quad, + Enum.EasingDirection.In + ) + local fadeAlpha = CurveUtil.ease( + math.clamp((alpha - 0.1) / 0.7, 0, 1), + Enum.EasingStyle.Quad, + Enum.EasingDirection.In + ) local baseColor = (stylesState:Get()[Enums.ButtonStateType.Enabled] :: TextStyle).BackgroundColor3 local rippleColor = (Color3.new(1, 1, 1):Lerp(baseColor, 0.8)):Lerp(baseColor, fadeAlpha) - local leftOffset = math.clamp(initialAlpha - moveAlpha, RIP_STEP, math.max(initialAlpha - RIP_STEP, RIP_STEP * 1.5)) - local rightOffset = math.clamp(initialAlpha + moveAlpha, math.min(initialAlpha + RIP_STEP, 1 - RIP_STEP * 1.5), 1 - RIP_STEP) + local leftOffset = + math.clamp(initialAlpha - moveAlpha, RIP_STEP, math.max(initialAlpha - RIP_STEP, RIP_STEP * 1.5)) + local rightOffset = math.clamp( + initialAlpha + moveAlpha, + math.min(initialAlpha + RIP_STEP, 1 - RIP_STEP * 1.5), + 1 - RIP_STEP + ) rippleColorState:Set(ColorSequence.new({ ColorSequenceKeypoint.new(0, baseColor), @@ -232,17 +261,22 @@ return function( end, scaleState, cornerRadiusState), }), _new("UIGradient")({ - Color = _Computed(function(useRip: boolean, style: TextStyle, seq: ColorSequence?): ColorSequence - if useRip then - if seq then - return seq + Color = _Computed( + function(useRip: boolean, style: TextStyle, seq: ColorSequence?): ColorSequence + if useRip then + if seq then + return seq + else + return ColorSequence.new(style.BackgroundColor3) + end else - return ColorSequence.new(style.BackgroundColor3) + return ColorSequence.new(Color3.new(1, 1, 1)) end - else - return ColorSequence.new(Color3.new(1, 1, 1)) - end - end, useRippleState, currentStyleState, rippleColorState), + end, + useRippleState, + currentStyleState, + rippleColorState + ), }), _new("UIStroke")({ ApplyStrokeMode = Enum.ApplyStrokeMode.Border, @@ -318,28 +352,40 @@ return function( end, scaleState), }), _new("UIPadding")({ - PaddingLeft = _Computed(function(s: number, icon: ImageData?, txt: string, padScale: number): UDim - if icon then - if txt:len() > 0 then - return UDim.new(0, padScale * LEFT_PADDING_WITH_ICON_DP * s) + PaddingLeft = _Computed( + function(s: number, icon: ImageData?, txt: string, padScale: number): UDim + if icon then + if txt:len() > 0 then + return UDim.new(0, padScale * LEFT_PADDING_WITH_ICON_DP * s) + else + return UDim.new(0, padScale * s * (HEIGHT_DP - ICON_SIZE_DP) / 2) + end else - return UDim.new(0, padScale * s * (HEIGHT_DP - ICON_SIZE_DP) / 2) + return UDim.new(0, padScale * LEFT_RIGHT_PADDING_DP * s) end - else - return UDim.new(0, padScale * LEFT_RIGHT_PADDING_DP * s) - end - end, scaleState, iconState, textState, paddingScaleState), - PaddingRight = _Computed(function(s: number, icon: ImageData?, txt: string, padScale: number): UDim - if icon then - if txt:len() > 0 then - return UDim.new(0, padScale * RIGHT_PADDING_WITH_ICON_DP * s) + end, + scaleState, + iconState, + textState, + paddingScaleState + ), + PaddingRight = _Computed( + function(s: number, icon: ImageData?, txt: string, padScale: number): UDim + if icon then + if txt:len() > 0 then + return UDim.new(0, padScale * RIGHT_PADDING_WITH_ICON_DP * s) + else + return UDim.new(0, padScale * s * (HEIGHT_DP - ICON_SIZE_DP) / 2) + end else - return UDim.new(0, padScale * s * (HEIGHT_DP - ICON_SIZE_DP) / 2) + return UDim.new(0, padScale * LEFT_RIGHT_PADDING_DP * s) end - else - return UDim.new(0, padScale * LEFT_RIGHT_PADDING_DP * s) - end - end, scaleState, iconState, textState, paddingScaleState), + end, + scaleState, + iconState, + textState, + paddingScaleState + ), PaddingTop = _Computed(function(s: number, padScale: number): UDim return UDim.new(0, padScale * s * (HEIGHT_DP - ICON_SIZE_DP) / 2) end, scaleState, paddingScaleState), diff --git a/src/Component/Button/ElevatedButton/cfusion.story.luau b/src/Component/Button/ElevatedButton/cfusion.story.luau index 36321802..02c5ca92 100644 --- a/src/Component/Button/ElevatedButton/cfusion.story.luau +++ b/src/Component/Button/ElevatedButton/cfusion.story.luau @@ -21,7 +21,9 @@ return function(frame: Frame) task.spawn(function() local function makeHalfFrame(isDarkMode: boolean, color: Color3): Frame local halfFrame = maid:GiveTask(Instance.new("Frame")) - halfFrame.BackgroundColor3 = if isDarkMode then Color3.new(0.15, 0.15, 0.15) else Color3.new(0.85, 0.85, 0.85) + halfFrame.BackgroundColor3 = if isDarkMode + then Color3.new(0.15, 0.15, 0.15) + else Color3.new(0.85, 0.85, 0.85) local listLayout = maid:GiveTask(Instance.new("UIListLayout")) listLayout.FillDirection = Enum.FillDirection.Vertical @@ -31,7 +33,14 @@ return function(frame: Frame) listLayout.Parent = halfFrame local Module = require(script.Parent) - local theme = Types.newThemeData(1, isDarkMode, SCALE, Font.fromEnum(Enum.Font.SourceSans), color, halfFrame.BackgroundColor3) + local theme = Types.newThemeData( + 1, + isDarkMode, + SCALE, + Font.fromEnum(Enum.Font.SourceSans), + color, + halfFrame.BackgroundColor3 + ) do local button = maid:GiveTask(Module.cfusion(function() @@ -48,9 +57,21 @@ return function(frame: Frame) end do - local button = maid:GiveTask(Module.cfusion(function() - print("click") - end, "Icon", theme, Types.newImageData(Icons.voice_chat.Image, Icons.voice_chat.ImageRectOffset, Icons.voice_chat.ImageRectSize), true)) + local button = maid:GiveTask( + Module.cfusion( + function() + print("click") + end, + "Icon", + theme, + Types.newImageData( + Icons.voice_chat.Image, + Icons.voice_chat.ImageRectOffset, + Icons.voice_chat.ImageRectSize + ), + true + ) + ) button.Parent = halfFrame end diff --git a/src/Component/Button/ElevatedButton/init.luau b/src/Component/Button/ElevatedButton/init.luau index aed1c0fd..55feac98 100644 --- a/src/Component/Button/ElevatedButton/init.luau +++ b/src/Component/Button/ElevatedButton/init.luau @@ -35,7 +35,13 @@ local DISABLE_BACK_TRANS = Config.Transparency.Background.Disabled -- Class local Interface = {} -function Interface.cfusion(onClick: CanBeState<() -> ()>, text: CanBeState, theme: CanBeState, icon: CanBeState?, isEnabled: CanBeState?): ImageLabel +function Interface.cfusion( + onClick: CanBeState<() -> ()>, + text: CanBeState, + theme: CanBeState, + icon: CanBeState?, + isEnabled: CanBeState? +): ImageLabel local maid = Maid.new() local _fuse = ColdFusion.fuse(maid) @@ -50,7 +56,16 @@ function Interface.cfusion(onClick: CanBeState<() -> ()>, text: CanBeState ()>, text: CanBeState ()>, text: CanBeState, theme: CanBeState, icon: CanBeState?, isEnabled: CanBeState?): ImageLabel +function Interface.cfusion( + onClick: CanBeState<() -> ()>, + text: CanBeState, + theme: CanBeState, + icon: CanBeState?, + isEnabled: CanBeState? +): ImageLabel local maid = Maid.new() local _fuse = ColdFusion.fuse(maid) @@ -50,7 +56,16 @@ function Interface.cfusion(onClick: CanBeState<() -> ()>, text: CanBeState ()>, text: CanBeState ()>, icon: CanBeState, theme: CanBeState, isEnabled: CanBeState?): ImageLabel +function Interface.cfusion( + onClick: CanBeState<() -> ()>, + icon: CanBeState, + theme: CanBeState, + isEnabled: CanBeState? +): ImageLabel local maid = Maid.new() local _fuse = ColdFusion.fuse(maid) @@ -49,7 +54,16 @@ function Interface.cfusion(onClick: CanBeState<() -> ()>, icon: CanBeState ()>, icon: CanBeState ()>, text: CanBeState, theme: CanBeState, icon: CanBeState?, isEnabled: CanBeState?): ImageLabel +function Interface.cfusion( + onClick: CanBeState<() -> ()>, + text: CanBeState, + theme: CanBeState, + icon: CanBeState?, + isEnabled: CanBeState? +): ImageLabel local maid = Maid.new() local _fuse = ColdFusion.fuse(maid) @@ -50,7 +56,16 @@ function Interface.cfusion(onClick: CanBeState<() -> ()>, text: CanBeState ()>, text: CanBeState ()>, icon: CanBeState, theme: CanBeState, isEnabled: CanBeState?): ImageLabel +function Interface.cfusion( + onClick: CanBeState<() -> ()>, + icon: CanBeState, + theme: CanBeState, + isEnabled: CanBeState? +): ImageLabel local maid = Maid.new() local _fuse = ColdFusion.fuse(maid) @@ -49,7 +54,16 @@ function Interface.cfusion(onClick: CanBeState<() -> ()>, icon: CanBeState ()>, icon: CanBeState ()>, icon: CanBeState, theme: CanBeState, isEnabled: CanBeState?): ImageLabel +function Interface.cfusion( + onClick: CanBeState<() -> ()>, + icon: CanBeState, + theme: CanBeState, + isEnabled: CanBeState? +): ImageLabel local maid = Maid.new() local _fuse = ColdFusion.fuse(maid) @@ -51,7 +56,16 @@ function Interface.cfusion(onClick: CanBeState<() -> ()>, icon: CanBeState ()>, icon: CanBeState ()>, icon: CanBeState ()>, icon: CanBeState ()>, text: CanBeState, theme: CanBeState, icon: CanBeState?, isEnabled: CanBeState?): ImageLabel +function Interface.cfusion( + onClick: CanBeState<() -> ()>, + text: CanBeState, + theme: CanBeState, + icon: CanBeState?, + isEnabled: CanBeState? +): ImageLabel local maid = Maid.new() local _fuse = ColdFusion.fuse(maid) @@ -52,7 +58,16 @@ function Interface.cfusion(onClick: CanBeState<() -> ()>, text: CanBeState ()>, text: CanBeState ()>, text: CanBeState ()>, text: CanBeState ()>, icon: CanBeState, theme: CanBeState, isEnabled: CanBeState?): ImageLabel +function Interface.cfusion( + onClick: CanBeState<() -> ()>, + icon: CanBeState, + theme: CanBeState, + isEnabled: CanBeState? +): ImageLabel local maid = Maid.new() local _fuse = ColdFusion.fuse(maid) @@ -51,7 +56,16 @@ function Interface.cfusion(onClick: CanBeState<() -> ()>, icon: CanBeState ()>, icon: CanBeState ()>, icon: CanBeState ()>, icon: CanBeState, + options: CanBeState<{ [number]: OptionData }>, isMultiSelect: CanBeState, - styles: CanBeState<{[Enums.ButtonStateType]: ToggleTextStyle}>, + styles: CanBeState<{ [Enums.ButtonStateType]: ToggleTextStyle }>, scale: CanBeState, font: CanBeState, density: CanBeState, sound: CanBeState ): Frame - local _fuse = ColdFusion.fuse(maid) - + local _new = _fuse.new local _bind = _fuse.bind local _clone = _fuse.clone local _import = _fuse.import - + local _Value = _fuse.Value local _Computed = _fuse.Computed - local optionsState: State<{[number]: OptionData}> = _import( - options, - {} - ) + local optionsState: State<{ [number]: OptionData }> = _import(options, {}) - local isMultiSelectState: State = _import( - isMultiSelect, - false - ) + local isMultiSelectState: State = _import(isMultiSelect, false) - local stylesState: State<{[Enums.ButtonStateType]: ToggleTextStyle}> = _import( - styles, - {} - ) + local stylesState: State<{ [Enums.ButtonStateType]: ToggleTextStyle }> = _import(styles, {}) local soundState: State = _import(sound, nil :: Sound?) @@ -97,11 +87,11 @@ function new( local fontState: State = _import(font, Font.fromEnum(Enum.Font.SourceSansSemibold)) local heightState = _Computed(function(s: number, d: number): number - return s*(HEIGHT_DP+(d*4)) + return s * (HEIGHT_DP + (d * 4)) end, scaleState, densityState) local ratioState = _Computed(function(d: number): number - return 3 * ((HEIGHT_DP-(d*4))/HEIGHT_DP) + return 3 * ((HEIGHT_DP - (d * 4)) / HEIGHT_DP) end, densityState) local inst = _new("Frame")({ @@ -136,14 +126,14 @@ function new( }), _new("UIStroke")({ ApplyStrokeMode = Enum.ApplyStrokeMode.Border, - Color = _Computed(function(styles: {[Enums.ButtonStateType]: ToggleTextStyle}): Color3 + Color = _Computed(function(styles: { [Enums.ButtonStateType]: ToggleTextStyle }): Color3 return styles[Enums.ButtonStateType.Enabled].Unselected.BorderColor3 end, stylesState), LineJoinMode = Enum.LineJoinMode.Round, Thickness = _Computed(function(s: number): number return math.max(s * OUTLINE_WIDTH_DP * 1, 1) end, scaleState), - Transparency = _Computed(function(styles: {[Enums.ButtonStateType]: ToggleTextStyle}): number + Transparency = _Computed(function(styles: { [Enums.ButtonStateType]: ToggleTextStyle }): number return styles[Enums.ButtonStateType.Enabled].Unselected.BorderTransparency end, stylesState), }), @@ -153,18 +143,20 @@ function new( return Vector2.new(s * MIN_LEFT_RIGHT_PADDING_DP * 2, 0) end, scaleState), }), - } + }, }) :: Frame local deselectAll = maid:GiveTask(Signal.new()) + for i = 1, MAX_BUTTON_COUNT do + local optionDataState: State = _Computed( + function(options: { [number]: OptionData }): OptionData? + return options[i] + end, + optionsState + ) - for i=1, MAX_BUTTON_COUNT do - local optionDataState: State = _Computed(function(options: {[number]: OptionData}): OptionData? - return options[i] - end, optionsState) - - local backgroundImageState = _Computed(function(options: {[number]: OptionData}): string + local backgroundImageState = _Computed(function(options: { [number]: OptionData }): string if #options == i then return RIGHT_CIRCLE_IMAGE elseif i == 1 then @@ -197,56 +189,71 @@ function new( maid:GiveTask(deselectAll:Connect(function(j: number) if j ~= i then if isSelectedState:Get() then - clickCount:Set(clickCount:Get()+1) + clickCount:Set(clickCount:Get() + 1) end end end)) - local currentStateState = _Computed(function(isEnabled: boolean, isFocused: boolean, isPressed: boolean, isHovered: boolean): Enums.ButtonStateType - if isEnabled then - if isPressed then - return Enums.ButtonStateType.Pressed - else - if isHovered then - return Enums.ButtonStateType.Hovered + local currentStateState = _Computed( + function( + isEnabled: boolean, + isFocused: boolean, + isPressed: boolean, + isHovered: boolean + ): Enums.ButtonStateType + if isEnabled then + if isPressed then + return Enums.ButtonStateType.Pressed else - if isFocused then - return Enums.ButtonStateType.Focused + if isHovered then + return Enums.ButtonStateType.Hovered else - return Enums.ButtonStateType.Enabled + if isFocused then + return Enums.ButtonStateType.Focused + else + return Enums.ButtonStateType.Enabled + end end end + else + return Enums.ButtonStateType.Disabled end - else - return Enums.ButtonStateType.Disabled - end - end, isEnabledState, isFocusedState, isPressedState, isHoveredState) :: State - + end, + isEnabledState, + isFocusedState, + isPressedState, + isHoveredState + ) :: State local iconState = _Computed(function(optionData: OptionData?, isSelected: boolean): ImageData? return if optionData then if isSelected then optionData.SelectedIcon else optionData.Icon else nil end, optionDataState, isSelectedState) - + local textState = _Computed(function(optionData: OptionData?, isSelected: boolean): string return if optionData then if isSelected then optionData.SelectedText else optionData.Text else "" end, optionDataState, isSelectedState) - local currentStyleState = _Computed(function( - state: Enums.ButtonStateType, - isSelected: boolean, - styles: { [Enums.ButtonStateType]: ToggleTextStyle } - ): TextStyle - local toggleStyle = styles[state] - assert(toggleStyle ~= nil, `no style for {state}`) - if isSelected then - return toggleStyle.Selected - else - return toggleStyle.Unselected - end - end, currentStateState, isSelectedState, stylesState) + local currentStyleState = _Computed( + function( + state: Enums.ButtonStateType, + isSelected: boolean, + styles: { [Enums.ButtonStateType]: ToggleTextStyle } + ): TextStyle + local toggleStyle = styles[state] + assert(toggleStyle ~= nil, `no style for {state}`) + if isSelected then + return toggleStyle.Selected + else + return toggleStyle.Unselected + end + end, + currentStateState, + isSelectedState, + stylesState + ) local barSizeState = _Computed(function(s: number): UDim2 - return UDim2.new(0, s*OUTLINE_WIDTH_DP,1,0) + return UDim2.new(0, s * OUTLINE_WIDTH_DP, 1, 0) end, scaleState) _new("Frame")({ @@ -256,12 +263,18 @@ function new( LayoutOrder = i - 0.5, Size = barSizeState, BorderSizePixel = 0, - BackgroundTransparency = _Computed(function(styleList: {[Enums.ButtonStateType]: ToggleTextStyle}): number - return styleList[Enums.ButtonStateType.Enabled].Unselected.BorderTransparency - end, stylesState), - BackgroundColor3 = _Computed(function(styleList: {[Enums.ButtonStateType]: ToggleTextStyle}): Color3 - return styleList[Enums.ButtonStateType.Enabled].Unselected.BorderColor3 - end, stylesState), + BackgroundTransparency = _Computed( + function(styleList: { [Enums.ButtonStateType]: ToggleTextStyle }): number + return styleList[Enums.ButtonStateType.Enabled].Unselected.BorderTransparency + end, + stylesState + ), + BackgroundColor3 = _Computed( + function(styleList: { [Enums.ButtonStateType]: ToggleTextStyle }): Color3 + return styleList[Enums.ButtonStateType.Enabled].Unselected.BorderColor3 + end, + stylesState + ), Parent = inst, }) @@ -269,10 +282,10 @@ function new( Visible = _Computed(function(data: OptionData?): boolean return data ~= nil end, optionDataState), - Size = _Computed(function(options: {[number]: OptionData}, barSize: UDim2): UDim2 + Size = _Computed(function(options: { [number]: OptionData }, barSize: UDim2): UDim2 local buttonCount = #options - local avgBarReduction = barSize.X.Offset * (buttonCount-1) / buttonCount - return UDim2.new(1/buttonCount,-avgBarReduction,1,0) + local avgBarReduction = barSize.X.Offset * (buttonCount - 1) / buttonCount + return UDim2.new(1 / buttonCount, -avgBarReduction, 1, 0) end, optionsState, barSizeState), LayoutOrder = i, Parent = inst, @@ -297,7 +310,7 @@ function new( local count = clickCount:Get() + 1 clickCount:Set(count) local initialSelect: boolean = isInitiallySelected:Get() - + local s = soundState:Get() if s then SoundService:PlayLocalSound(s) @@ -307,7 +320,7 @@ function new( deselectAll:Fire(i) end - if count%2 == 0 then + if count % 2 == 0 then onClick(initialSelect) else onClick(not initialSelect) @@ -418,19 +431,19 @@ function new( }), _new("UIPadding")({ PaddingLeft = _Computed(function(s: number): UDim - return UDim.new(0, s * (MIN_LEFT_RIGHT_PADDING_DP+ELEMENT_SEPARATION_PADDING_DP)) + return UDim.new(0, s * (MIN_LEFT_RIGHT_PADDING_DP + ELEMENT_SEPARATION_PADDING_DP)) end, scaleState), PaddingRight = _Computed(function(s: number): UDim - return UDim.new(0, s * (MIN_LEFT_RIGHT_PADDING_DP+ELEMENT_SEPARATION_PADDING_DP)) + return UDim.new(0, s * (MIN_LEFT_RIGHT_PADDING_DP + ELEMENT_SEPARATION_PADDING_DP)) end, scaleState), PaddingTop = _Computed(function(s: number, h: number): UDim - return UDim.new(0, (h - s *ICON_SIZE_DP)/2) + return UDim.new(0, (h - s * ICON_SIZE_DP) / 2) end, scaleState, heightState), PaddingBottom = _Computed(function(s: number, h: number): UDim - return UDim.new(0, (h - s *ICON_SIZE_DP)/2) + return UDim.new(0, (h - s * ICON_SIZE_DP) / 2) end, scaleState, heightState), }), - } + }, }) end @@ -440,9 +453,9 @@ end local Interface = {} function Interface.cfusion( - options: CanBeState<{[number]: OptionData}>, + options: CanBeState<{ [number]: OptionData }>, isMultiSelect: CanBeState, - theme: CanBeState, + theme: CanBeState, density: CanBeState ): Frame local maid = Maid.new() @@ -457,14 +470,22 @@ function Interface.cfusion( local _Value = _fuse.Value local _Computed = _fuse.Computed - local themeState = _import(theme, Types.newThemeData(1, false, 1, Font.fromEnum(Enum.Font.SourceSansSemibold), Color3.fromHSV(0.8, 0.4, 0.8))) + local themeState = _import( + theme, + Types.newThemeData( + 1, + false, + 1, + Font.fromEnum(Enum.Font.SourceSansSemibold), + Color3.fromHSV(0.8, 0.4, 0.8) + ) + ) local sound = maid:GiveTask(Instance.new("Sound")) sound.Volume = DEFAULT_VOLUME sound.SoundId = Sounds.ui_tap_variant_01 local styles = _Computed(function(thm: ThemeData): { [Enums.ButtonStateType]: ToggleTextStyle } - local unselectedColor = thm.Color3 local selectedColor = thm.SelectionColor3 @@ -498,10 +519,16 @@ function Interface.cfusion( (function(): Color3 if thm.IsDarkMode then local h, _s, v = selectedTextColor:ToHSV() - return Util.getReadableColor(Color3.fromHSV(h, 0, v), if thm.BackgroundColor3 then thm.BackgroundColor3 else Color3.new(0.15, 0.15, 0.15)) + return Util.getReadableColor( + Color3.fromHSV(h, 0, v), + if thm.BackgroundColor3 then thm.BackgroundColor3 else Color3.new(0.15, 0.15, 0.15) + ) else local h, _s, v = unselectedTextColor:ToHSV() - return Util.getReadableColor(Color3.fromHSV(h, 0, v), if thm.BackgroundColor3 then thm.BackgroundColor3 else Color3.new(0.85, 0.85, 0.85)) + return Util.getReadableColor( + Color3.fromHSV(h, 0, v), + if thm.BackgroundColor3 then thm.BackgroundColor3 else Color3.new(0.85, 0.85, 0.85) + ) end end)(), DISABLE_TRANSPARENCY, @@ -514,10 +541,16 @@ function Interface.cfusion( (function(): Color3 if thm.IsDarkMode then local h, _s, v = selectedTextColor:ToHSV() - return Util.getReadableColor(Color3.fromHSV(h, 0, v), if thm.BackgroundColor3 then thm.BackgroundColor3 else Color3.new(0.15, 0.15, 0.15)) + return Util.getReadableColor( + Color3.fromHSV(h, 0, v), + if thm.BackgroundColor3 then thm.BackgroundColor3 else Color3.new(0.15, 0.15, 0.15) + ) else local h, _s, v = unselectedTextColor:ToHSV() - return Util.getReadableColor(Color3.fromHSV(h, 0, v), if thm.BackgroundColor3 then thm.BackgroundColor3 else Color3.new(0.85, 0.85, 0.85)) + return Util.getReadableColor( + Color3.fromHSV(h, 0, v), + if thm.BackgroundColor3 then thm.BackgroundColor3 else Color3.new(0.85, 0.85, 0.85) + ) end end)(), DISABLE_TRANSPARENCY, @@ -528,21 +561,62 @@ function Interface.cfusion( ) ), [Enums.ButtonStateType.Focused] = Types.newToggleTextStyle( - Types.newTextStyle(selectedTextColor, 0, selectedColor, FOCUS_TRANSPARENCY, selectedBorderColor, 0), - Types.newTextStyle(unselectedTextColor, 0, unselectedColor, FOCUS_TRANSPARENCY, unselectedBorderColor, 0) + Types.newTextStyle( + selectedTextColor, + 0, + selectedColor, + FOCUS_TRANSPARENCY, + selectedBorderColor, + 0 + ), + Types.newTextStyle( + unselectedTextColor, + 0, + unselectedColor, + FOCUS_TRANSPARENCY, + unselectedBorderColor, + 0 + ) ), [Enums.ButtonStateType.Hovered] = Types.newToggleTextStyle( - Types.newTextStyle(selectedTextColor, 0, selectedColor, HOVER_TRANSPARENCY, selectedBorderColor, 0), - Types.newTextStyle(unselectedTextColor, 0, unselectedColor, HOVER_TRANSPARENCY, unselectedBorderColor, 0) + Types.newTextStyle( + selectedTextColor, + 0, + selectedColor, + HOVER_TRANSPARENCY, + selectedBorderColor, + 0 + ), + Types.newTextStyle( + unselectedTextColor, + 0, + unselectedColor, + HOVER_TRANSPARENCY, + unselectedBorderColor, + 0 + ) ), [Enums.ButtonStateType.Pressed] = Types.newToggleTextStyle( - Types.newTextStyle(selectedTextColor, 0, selectedColor, PRESS_TRANSPARENCY, selectedBorderColor, 0), - Types.newTextStyle(unselectedTextColor, 0, unselectedColor, PRESS_TRANSPARENCY, unselectedBorderColor, 0) + Types.newTextStyle( + selectedTextColor, + 0, + selectedColor, + PRESS_TRANSPARENCY, + selectedBorderColor, + 0 + ), + Types.newTextStyle( + unselectedTextColor, + 0, + unselectedColor, + PRESS_TRANSPARENCY, + unselectedBorderColor, + 0 + ) ), } return data - end, themeState) local buttonRow = new( diff --git a/src/Component/Button/TextButton/cfusion.story.luau b/src/Component/Button/TextButton/cfusion.story.luau index 36321802..02c5ca92 100644 --- a/src/Component/Button/TextButton/cfusion.story.luau +++ b/src/Component/Button/TextButton/cfusion.story.luau @@ -21,7 +21,9 @@ return function(frame: Frame) task.spawn(function() local function makeHalfFrame(isDarkMode: boolean, color: Color3): Frame local halfFrame = maid:GiveTask(Instance.new("Frame")) - halfFrame.BackgroundColor3 = if isDarkMode then Color3.new(0.15, 0.15, 0.15) else Color3.new(0.85, 0.85, 0.85) + halfFrame.BackgroundColor3 = if isDarkMode + then Color3.new(0.15, 0.15, 0.15) + else Color3.new(0.85, 0.85, 0.85) local listLayout = maid:GiveTask(Instance.new("UIListLayout")) listLayout.FillDirection = Enum.FillDirection.Vertical @@ -31,7 +33,14 @@ return function(frame: Frame) listLayout.Parent = halfFrame local Module = require(script.Parent) - local theme = Types.newThemeData(1, isDarkMode, SCALE, Font.fromEnum(Enum.Font.SourceSans), color, halfFrame.BackgroundColor3) + local theme = Types.newThemeData( + 1, + isDarkMode, + SCALE, + Font.fromEnum(Enum.Font.SourceSans), + color, + halfFrame.BackgroundColor3 + ) do local button = maid:GiveTask(Module.cfusion(function() @@ -48,9 +57,21 @@ return function(frame: Frame) end do - local button = maid:GiveTask(Module.cfusion(function() - print("click") - end, "Icon", theme, Types.newImageData(Icons.voice_chat.Image, Icons.voice_chat.ImageRectOffset, Icons.voice_chat.ImageRectSize), true)) + local button = maid:GiveTask( + Module.cfusion( + function() + print("click") + end, + "Icon", + theme, + Types.newImageData( + Icons.voice_chat.Image, + Icons.voice_chat.ImageRectOffset, + Icons.voice_chat.ImageRectSize + ), + true + ) + ) button.Parent = halfFrame end diff --git a/src/Component/Button/TextButton/init.luau b/src/Component/Button/TextButton/init.luau index e8fc828c..296807c0 100644 --- a/src/Component/Button/TextButton/init.luau +++ b/src/Component/Button/TextButton/init.luau @@ -37,7 +37,13 @@ local DISABLE_TRANSPARENCY = Config.Transparency.Text.Disabled -- Class local Interface = {} -function Interface.cfusion(onClick: CanBeState<() -> ()>, text: CanBeState, theme: CanBeState, icon: CanBeState?, isEnabled: CanBeState?): ImageLabel +function Interface.cfusion( + onClick: CanBeState<() -> ()>, + text: CanBeState, + theme: CanBeState, + icon: CanBeState?, + isEnabled: CanBeState? +): ImageLabel local maid = Maid.new() local _fuse = ColdFusion.fuse(maid) @@ -52,7 +58,16 @@ function Interface.cfusion(onClick: CanBeState<() -> ()>, text: CanBeState ()>, text: CanBeState ()>, text: CanBeState ()>, text: CanBeState (), disabled: boolean, isInitiallySelected: boolean, - text: string, + text: string, icon: ImageData?, selectedText: string?, selectedIcon: ImageData? @@ -75,7 +75,12 @@ function Types.newImageData(image: string, rectOffset: Vector2?, rectSize: Vecto } end -function Types.newStyle(backgroundColor3: Color3, backgroundTransparency: number, borderColor3: Color3, borderTransparency: number): Style +function Types.newStyle( + backgroundColor3: Color3, + backgroundTransparency: number, + borderColor3: Color3, + borderTransparency: number +): Style return { BackgroundColor3 = backgroundColor3, BackgroundTransparency = backgroundTransparency, @@ -84,7 +89,14 @@ function Types.newStyle(backgroundColor3: Color3, backgroundTransparency: number } end -function Types.newTextStyle(textColor3: Color3, textTransparency: number, backgroundColor: Color3, backgroundTransparency: number, borderColor3: Color3, borderTransparency: number): TextStyle +function Types.newTextStyle( + textColor3: Color3, + textTransparency: number, + backgroundColor: Color3, + backgroundTransparency: number, + borderColor3: Color3, + borderTransparency: number +): TextStyle return { TextColor3 = textColor3, TextTransparency = textTransparency, @@ -95,17 +107,22 @@ function Types.newTextStyle(textColor3: Color3, textTransparency: number, backgr } end -function Types.newToggleTextStyle( - selected: TextStyle, - unselected: TextStyle -): ToggleTextStyle +function Types.newToggleTextStyle(selected: TextStyle, unselected: TextStyle): ToggleTextStyle return { Selected = selected, - Unselected = unselected + Unselected = unselected, } end -function Types.newThemeData(elevation: number, isDarkMode: boolean, scale: number, font: Font, color3: Color3, backgroundColor3: Color3?, selectionColor3: Color3?): ThemeData +function Types.newThemeData( + elevation: number, + isDarkMode: boolean, + scale: number, + font: Font, + color3: Color3, + backgroundColor3: Color3?, + selectionColor3: Color3? +): ThemeData return { Color3 = color3, SelectionColor3 = selectionColor3 or color3, diff --git a/src/Util.luau b/src/Util.luau index 81f32044..1ed57359 100644 --- a/src/Util.luau +++ b/src/Util.luau @@ -69,7 +69,11 @@ function Util.getIfReadable(textColor3: Color3, backgroundColor3: Color3, minCon end -- https://github.com/alex-page/a11ycolor/blob/main/index.js -function Util.getReadableColor(textColor3: Color3, backgroundColor3: Color3, minConstrastRatio: number?): Color3 +function Util.getReadableColor( + textColor3: Color3, + backgroundColor3: Color3, + minConstrastRatio: number? +): Color3 minConstrastRatio = minConstrastRatio or DEFAULT_CONTRAST_RATIO assert(minConstrastRatio) diff --git a/stylua.toml b/stylua.toml index c6eefb22..55c91d6e 100644 --- a/stylua.toml +++ b/stylua.toml @@ -1,7 +1,7 @@ -column_width = 140 +column_width = 110 line_endings = "Unix" indent_type = "Tabs" -indent_width = 4 +indent_width = 3 quote_style = "AutoPreferDouble" call_parentheses = "Always" collapse_simple_statement = "Never" From 5aeee731de703288c98c4b3bed1318ddc07ee362 Mon Sep 17 00:00:00 2001 From: Nightcycle <77173389+nightcycle@users.noreply.github.com> Date: Wed, 6 Dec 2023 16:05:04 -0500 Subject: [PATCH 14/57] Segment button coloring changes --- src/Component/Button/Segmented/init.luau | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Component/Button/Segmented/init.luau b/src/Component/Button/Segmented/init.luau index ce7b8b73..b0fb2ca0 100644 --- a/src/Component/Button/Segmented/init.luau +++ b/src/Component/Button/Segmented/init.luau @@ -493,11 +493,11 @@ function Interface.cfusion( local unselectedTextColor: Color3 if thm.IsDarkMode == false then - selectedTextColor = Util.DARK_SURFACE --Util.getReadableColor(Util.DARK_SURFACE, selectedColor) - unselectedTextColor = Util.DARK_SURFACE --Util.getReadableColor(Util.DARK_SURFACE, unselectedColor) + selectedTextColor = Util.getElevatedColor(Util.DARK_SURFACE, thm.Elevation, thm.IsDarkMode) --Util.getReadableColor(Util.DARK_SURFACE, selectedColor) + unselectedTextColor = Util.getElevatedColor(Util.DARK_SURFACE, thm.Elevation, thm.IsDarkMode) --Util.getReadableColor(Util.DARK_SURFACE, unselectedColor) else - selectedTextColor = Util.LIGHT_SURFACE --Util.getReadableColor(Util.LIGHT_SURFACE, selectedColor) - unselectedTextColor = Util.LIGHT_SURFACE --Util.getReadableColor(Util.LIGHT_SURFACE, unselectedColor) + selectedTextColor = Util.getElevatedColor(Util.LIGHT_SURFACE, thm.Elevation, thm.IsDarkMode) --Util.getReadableColor(Util.LIGHT_SURFACE, selectedColor) + unselectedTextColor = Util.getElevatedColor(Util.LIGHT_SURFACE, thm.Elevation, thm.IsDarkMode) --Util.getReadableColor(Util.LIGHT_SURFACE, unselectedColor) end selectedColor = Util.getReadableColor(selectedColor, selectedTextColor) From 8799423993dda4532f4e83b93d173c026a629205 Mon Sep 17 00:00:00 2001 From: Nightcycle <77173389+nightcycle@users.noreply.github.com> Date: Wed, 6 Dec 2023 18:35:34 -0500 Subject: [PATCH 15/57] Added badge component --- sourcemap.json | 2 +- src/Component/Button/Badge/cfusion.story.luau | 117 +++++ src/Component/Button/Badge/init.luau | 469 ++++++++++++++++++ src/Component/Button/Base.luau | 4 +- .../Button/Segmented/cfusion.story.luau | 1 - 5 files changed, 589 insertions(+), 4 deletions(-) create mode 100644 src/Component/Button/Badge/cfusion.story.luau create mode 100644 src/Component/Button/Badge/init.luau diff --git a/sourcemap.json b/sourcemap.json index dc7455b7..d9167d7b 100644 --- a/sourcemap.json +++ b/sourcemap.json @@ -1 +1 @@ -{"name":"synthetic-test","className":"DataModel","filePaths":["dev.project.json"],"children":[{"name":"ReplicatedStorage","className":"ReplicatedStorage","children":[{"name":"Packages","className":"Folder","children":[{"name":"ColdFusion","className":"ModuleScript","filePaths":["Packages\\ColdFusion.lua"]},{"name":"CurveUtil","className":"ModuleScript","filePaths":["Packages\\CurveUtil.lua"]},{"name":"Format","className":"ModuleScript","filePaths":["Packages\\Format.lua"]},{"name":"Fusion","className":"ModuleScript","filePaths":["Packages\\Fusion.lua"]},{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\Maid.lua"]},{"name":"MaterialIcons","className":"ModuleScript","filePaths":["Packages\\MaterialIcons.lua"]},{"name":"MeshUtil","className":"ModuleScript","filePaths":["Packages\\MeshUtil.lua"]},{"name":"Roact","className":"ModuleScript","filePaths":["Packages\\Roact.lua"]},{"name":"Signal","className":"ModuleScript","filePaths":["Packages\\Signal.lua"]},{"name":"_Index","className":"Folder","children":[{"name":"elttob_fusion@0.2.0","className":"Folder","children":[{"name":"fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\init.lua","Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\default.project.json"],"children":[{"name":"Animation","className":"Folder","children":[{"name":"Spring","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\Spring.lua"]},{"name":"SpringScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\SpringScheduler.lua"]},{"name":"Tween","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\Tween.lua"]},{"name":"TweenScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\TweenScheduler.lua"]},{"name":"getTweenRatio","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\getTweenRatio.lua"]},{"name":"lerpType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\lerpType.lua"]},{"name":"packType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\packType.lua"]},{"name":"springCoefficients","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\springCoefficients.lua"]},{"name":"unpackType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\unpackType.lua"]}]},{"name":"Colour","className":"Folder","children":[{"name":"Oklab","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Colour\\Oklab.lua"]}]},{"name":"Dependencies","className":"Folder","children":[{"name":"captureDependencies","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\captureDependencies.lua"]},{"name":"initDependency","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\initDependency.lua"]},{"name":"sharedState","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\sharedState.lua"]},{"name":"updateAll","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\updateAll.lua"]},{"name":"useDependency","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\useDependency.lua"]}]},{"name":"Instances","className":"Folder","children":[{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Children.lua"]},{"name":"Cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Cleanup.lua"]},{"name":"Hydrate","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Hydrate.lua"]},{"name":"New","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\New.lua"]},{"name":"OnChange","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\OnChange.lua"]},{"name":"OnEvent","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\OnEvent.lua"]},{"name":"Out","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Out.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Ref.lua"]},{"name":"applyInstanceProps","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\applyInstanceProps.lua"]},{"name":"defaultProps","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\defaultProps.lua"]}]},{"name":"Logging","className":"Folder","children":[{"name":"logError","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logError.lua"]},{"name":"logErrorNonFatal","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logErrorNonFatal.lua"]},{"name":"logWarn","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logWarn.lua"]},{"name":"messages","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\messages.lua"]},{"name":"parseError","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\parseError.lua"]}]},{"name":"PubTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\PubTypes.lua"]},{"name":"State","className":"Folder","children":[{"name":"Computed","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Computed.lua"]},{"name":"ForKeys","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForKeys.lua"]},{"name":"ForPairs","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForPairs.lua"]},{"name":"ForValues","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForValues.lua"]},{"name":"Observer","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Observer.lua"]},{"name":"Value","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Value.lua"]},{"name":"unwrap","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\unwrap.lua"]}]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Types.lua"]},{"name":"Utility","className":"Folder","children":[{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\None.lua"]},{"name":"cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\cleanup.lua"]},{"name":"doNothing","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\doNothing.lua"]},{"name":"isSimilar","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\isSimilar.lua"]},{"name":"needsDestruction","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\needsDestruction.lua"]},{"name":"restrictRead","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\restrictRead.lua"]},{"name":"xtypeof","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\xtypeof.lua"]}]}]}]},{"name":"nightcycle_cold-fusion@9.0.7","className":"Folder","children":[{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\Maid.lua"]},{"name":"ServiceProxy","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\ServiceProxy.lua"]},{"name":"Signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\Signal.lua"]},{"name":"TableUtil","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\TableUtil.lua"]},{"name":"cold-fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\init.luau","Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\default.project.json"],"children":[{"name":"Fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\init.lua"],"children":[{"name":"Animation","className":"Folder","children":[{"name":"Spring","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\Spring.lua"]},{"name":"SpringScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\SpringScheduler.lua"]},{"name":"Tween","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\Tween.lua"]},{"name":"TweenScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\TweenScheduler.lua"]},{"name":"getTweenRatio","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\getTweenRatio.lua"]},{"name":"lerpType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\lerpType.lua"]},{"name":"packType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\packType.lua"]},{"name":"springCoefficients","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\springCoefficients.lua"]},{"name":"unpackType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\unpackType.lua"]}]},{"name":"Colour","className":"Folder","children":[{"name":"Oklab","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Colour\\Oklab.lua"]}]},{"name":"Instances","className":"Folder","children":[{"name":"Attribute","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Attribute.lua"]},{"name":"AttributeChange","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\AttributeChange.lua"]},{"name":"AttributeOut","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\AttributeOut.lua"]},{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Children.lua"]},{"name":"Cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Cleanup.lua"]},{"name":"Hydrate","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Hydrate.lua"]},{"name":"New","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\New.lua"]},{"name":"OnChange","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\OnChange.lua"]},{"name":"OnEvent","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\OnEvent.lua"]},{"name":"Out","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Out.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Ref.lua"]},{"name":"applyInstanceProps","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\applyInstanceProps.lua"]},{"name":"defaultProps","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\defaultProps.lua"]}]},{"name":"Logging","className":"Folder","children":[{"name":"logError","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logError.lua"]},{"name":"logErrorNonFatal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logErrorNonFatal.lua"]},{"name":"logWarn","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logWarn.lua"]},{"name":"messages","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\messages.lua"]},{"name":"parseError","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\parseError.lua"]}]},{"name":"PubTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\PubTypes.lua"]},{"name":"State","className":"Folder","children":[{"name":"Computed","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Computed.lua"]},{"name":"ForKeys","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForKeys.lua"]},{"name":"ForPairs","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForPairs.lua"]},{"name":"ForValues","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForValues.lua"]},{"name":"Observer","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Observer.lua"]},{"name":"Value","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Value.lua"]},{"name":"isState","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\isState.lua"]},{"name":"makeUseCallback","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\makeUseCallback.lua"]},{"name":"peek","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\peek.lua"]},{"name":"updateAll","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\updateAll.lua"]}]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Types.lua"]},{"name":"Utility","className":"Folder","children":[{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\None.lua"]},{"name":"cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\cleanup.lua"]},{"name":"doNothing","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\doNothing.lua"]},{"name":"isSimilar","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\isSimilar.lua"]},{"name":"needsDestruction","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\needsDestruction.lua"]},{"name":"restrictRead","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\restrictRead.lua"]},{"name":"xtypeof","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\xtypeof.lua"]}]}]},{"name":"InstanceTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\InstanceTypes.luau"]},{"name":"Interface","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Interface.luau"]},{"name":"Test.story","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Test.story.luau"]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Types.luau"]},{"name":"Util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Util.luau"]}]}]},{"name":"nightcycle_curve-util@1.0.0","className":"Folder","children":[{"name":"Vector","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\Vector.lua"]},{"name":"curve-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\init.lua","Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\default.project.json"],"children":[{"name":"Ease","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\Ease.lua"]},{"name":"Lerp","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\Lerp.lua"]}]}]},{"name":"nightcycle_format@0.1.3","className":"Folder","children":[{"name":"format","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\init.lua","Packages\\_Index\\nightcycle_format@0.1.3\\format\\default.project.json"],"children":[{"name":"Emoji","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\Emoji.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\init.spec.lua"]}]},{"name":"maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\maid.lua"]},{"name":"signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\signal.lua"]},{"name":"string","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\string.lua"]}]},{"name":"nightcycle_geometry-util@1.1.1","className":"Folder","children":[{"name":"geometry-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\init.lua","Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\default.project.json"],"children":[{"name":"Earcut","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\Earcut\\init.lua"],"children":[{"name":"ZeroArray","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\Earcut\\ZeroArray.lua"]}]}]}]},{"name":"nightcycle_maid@1.1.4","className":"Folder","children":[{"name":"maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\init.lua","Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\default.project.json"],"children":[{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\Maid.lua"]},{"name":"MaidTaskUtils","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\MaidTaskUtils.lua"]}]}]},{"name":"nightcycle_material-icons@1.0.1","className":"Folder","children":[{"name":"material-icons","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\init.luau","Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\default.project.json"],"children":[{"name":"Default_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_1.luau"]},{"name":"Default_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_2.luau"]},{"name":"Default_18_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_3.luau"]},{"name":"Default_18_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_4.luau"]},{"name":"Default_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_1.luau"]},{"name":"Default_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_2.luau"]},{"name":"Default_24_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_3.luau"]},{"name":"Default_24_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_4.luau"]},{"name":"Default_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_1.luau"]},{"name":"Default_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_2.luau"]},{"name":"Default_36_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_3.luau"]},{"name":"Default_36_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_4.luau"]},{"name":"Default_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_1.luau"]},{"name":"Default_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_2.luau"]},{"name":"Default_48_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_3.luau"]},{"name":"Default_48_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_4.luau"]},{"name":"Outlined_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_18_1.luau"]},{"name":"Outlined_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_18_2.luau"]},{"name":"Outlined_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_24_1.luau"]},{"name":"Outlined_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_24_2.luau"]},{"name":"Outlined_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_36_1.luau"]},{"name":"Outlined_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_36_2.luau"]},{"name":"Outlined_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_48_1.luau"]},{"name":"Outlined_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_48_2.luau"]},{"name":"Round_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_18_1.luau"]},{"name":"Round_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_18_2.luau"]},{"name":"Round_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_24_1.luau"]},{"name":"Round_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_24_2.luau"]},{"name":"Round_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_36_1.luau"]},{"name":"Round_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_36_2.luau"]},{"name":"Round_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_48_1.luau"]},{"name":"Round_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_48_2.luau"]},{"name":"Sharp_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_18_1.luau"]},{"name":"Sharp_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_18_2.luau"]},{"name":"Sharp_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_24_1.luau"]},{"name":"Sharp_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_24_2.luau"]},{"name":"Sharp_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_36_1.luau"]},{"name":"Sharp_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_36_2.luau"]},{"name":"Sharp_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_48_1.luau"]},{"name":"Sharp_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_48_2.luau"]},{"name":"TwoTone_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_18_1.luau"]},{"name":"TwoTone_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_18_2.luau"]},{"name":"TwoTone_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_24_1.luau"]},{"name":"TwoTone_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_24_2.luau"]},{"name":"TwoTone_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_36_1.luau"]},{"name":"TwoTone_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_36_2.luau"]},{"name":"TwoTone_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_48_1.luau"]},{"name":"TwoTone_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_48_2.luau"]}]}]},{"name":"nightcycle_mesh-util@1.0.3","className":"Folder","children":[{"name":"GeometryUtil","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\GeometryUtil.lua"]},{"name":"mesh-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\init.lua","Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\default.project.json"],"children":[{"name":"CornerWedgePart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\CornerWedgePart.lua"]},{"name":"Part","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\Part.lua"]},{"name":"TetraPart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\TetraPart.lua"]},{"name":"WedgePart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\WedgePart.lua"]}]}]},{"name":"nightcycle_service-proxy@1.0.0","className":"Folder","children":[{"name":"service-proxy","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_service-proxy@1.0.0\\service-proxy\\src\\init.lua","Packages\\_Index\\nightcycle_service-proxy@1.0.0\\service-proxy\\default.project.json"]}]},{"name":"nightcycle_signal@1.0.2","className":"Folder","children":[{"name":"signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_signal@1.0.2\\signal\\src\\init.lua","Packages\\_Index\\nightcycle_signal@1.0.2\\signal\\default.project.json"]}]},{"name":"nightcycle_string@0.1.0","className":"Folder","children":[{"name":"string","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_string@0.1.0\\string\\src\\init.lua","Packages\\_Index\\nightcycle_string@0.1.0\\string\\default.project.json"],"children":[{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_string@0.1.0\\string\\src\\init.spec.lua"]}]}]},{"name":"nightcycle_table-util@1.1.0","className":"Folder","children":[{"name":"table-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_table-util@1.1.0\\table-util\\src\\init.lua","Packages\\_Index\\nightcycle_table-util@1.1.0\\table-util\\default.project.json"]}]},{"name":"nightcycle_vector@1.0.2","className":"Folder","children":[{"name":"vector","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_vector@1.0.2\\vector\\src\\init.lua","Packages\\_Index\\nightcycle_vector@1.0.2\\vector\\default.project.json"]}]},{"name":"roblox_roact@1.4.4","className":"Folder","children":[{"name":"roact","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\init.lua","Packages\\_Index\\roblox_roact@1.4.4\\roact\\default.project.json"],"children":[{"name":"Binding","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Binding.lua"]},{"name":"Binding.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Binding.spec.lua"]},{"name":"Component","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.lua"]},{"name":"Component.spec","className":"Folder","children":[{"name":"context.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\context.spec.lua"]},{"name":"defaultProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\defaultProps.spec.lua"]},{"name":"didMount.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\didMount.spec.lua"]},{"name":"didUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\didUpdate.spec.lua"]},{"name":"extend.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\extend.spec.lua"]},{"name":"getDerivedStateFromProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\getDerivedStateFromProps.spec.lua"]},{"name":"getElementTraceback.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\getElementTraceback.spec.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\init.spec.lua"]},{"name":"legacyContext.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\legacyContext.spec.lua"]},{"name":"render.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\render.spec.lua"]},{"name":"setState.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\setState.spec.lua"]},{"name":"shouldUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\shouldUpdate.spec.lua"]},{"name":"validateProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\validateProps.spec.lua"]},{"name":"willUnmount.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\willUnmount.spec.lua"]},{"name":"willUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\willUpdate.spec.lua"]}]},{"name":"ComponentLifecyclePhase","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ComponentLifecyclePhase.lua"]},{"name":"Config","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Config.lua"]},{"name":"Config.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Config.spec.lua"]},{"name":"ElementKind","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementKind.lua"]},{"name":"ElementKind.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementKind.spec.lua"]},{"name":"ElementUtils","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementUtils.lua"]},{"name":"ElementUtils.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementUtils.spec.lua"]},{"name":"GlobalConfig","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\GlobalConfig.lua"]},{"name":"GlobalConfig.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\GlobalConfig.spec.lua"]},{"name":"Logging","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Logging.lua"]},{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\None.lua"]},{"name":"NoopRenderer","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\NoopRenderer.lua"]},{"name":"Portal","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Portal.lua"]},{"name":"PropMarkers","className":"Folder","children":[{"name":"Change","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Change.lua"]},{"name":"Change.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Change.spec.lua"]},{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Children.lua"]},{"name":"Event","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Event.lua"]},{"name":"Event.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Event.spec.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Ref.lua"]}]},{"name":"PureComponent","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PureComponent.lua"]},{"name":"PureComponent.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PureComponent.spec.lua"]},{"name":"RobloxRenderer","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\RobloxRenderer.lua"]},{"name":"RobloxRenderer.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\RobloxRenderer.spec.lua"]},{"name":"SingleEventManager","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\SingleEventManager.lua"]},{"name":"SingleEventManager.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\SingleEventManager.spec.lua"]},{"name":"Symbol","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Symbol.lua"]},{"name":"Symbol.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Symbol.spec.lua"]},{"name":"Type","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Type.lua"]},{"name":"Type.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Type.spec.lua"]},{"name":"assertDeepEqual","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assertDeepEqual.lua"]},{"name":"assertDeepEqual.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assertDeepEqual.spec.lua"]},{"name":"assign","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assign.lua"]},{"name":"assign.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assign.spec.lua"]},{"name":"createContext","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createContext.lua"]},{"name":"createContext.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createContext.spec.lua"]},{"name":"createElement","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createElement.lua"]},{"name":"createElement.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createElement.spec.lua"]},{"name":"createFragment","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createFragment.lua"]},{"name":"createFragment.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createFragment.spec.lua"]},{"name":"createReconciler","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconciler.lua"]},{"name":"createReconciler.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconciler.spec.lua"]},{"name":"createReconcilerCompat","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconcilerCompat.lua"]},{"name":"createReconcilerCompat.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconcilerCompat.spec.lua"]},{"name":"createRef","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createRef.lua"]},{"name":"createRef.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createRef.spec.lua"]},{"name":"createSignal","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSignal.lua"]},{"name":"createSignal.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSignal.spec.lua"]},{"name":"createSpy","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSpy.lua"]},{"name":"createSpy.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSpy.spec.lua"]},{"name":"forwardRef","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\forwardRef.lua"]},{"name":"forwardRef.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\forwardRef.spec.lua"]},{"name":"getDefaultInstanceProperty","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\getDefaultInstanceProperty.lua"]},{"name":"getDefaultInstanceProperty.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\getDefaultInstanceProperty.spec.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\init.spec.lua"]},{"name":"internalAssert","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\internalAssert.lua"]},{"name":"invalidSetStateMessages","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\invalidSetStateMessages.lua"]},{"name":"oneChild","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\oneChild.lua"]},{"name":"oneChild.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\oneChild.spec.lua"]},{"name":"strict","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\strict.lua"]},{"name":"strict.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\strict.spec.lua"]}]}]}]},{"name":"synthetic","className":"ModuleScript","filePaths":["src\\init.luau"],"children":[{"name":"Component","className":"Folder","children":[{"name":"Button","className":"Folder","children":[{"name":"Base","className":"ModuleScript","filePaths":["src\\Component\\Button\\Base.luau"]},{"name":"ElevatedButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\ElevatedButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\ElevatedButton\\cfusion.story.luau"]}]},{"name":"ExtendedFAB","className":"ModuleScript","filePaths":["src\\Component\\Button\\ExtendedFAB\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\ExtendedFAB\\cfusion.story.luau"]}]},{"name":"FAB","className":"ModuleScript","filePaths":["src\\Component\\Button\\FAB\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\FAB\\cfusion.story.luau"]}]},{"name":"FilledButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledButton\\cfusion.story.luau"]}]},{"name":"FilledIconButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledIconButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledIconButton\\cfusion.story.luau"]}]},{"name":"IconButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\IconButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\IconButton\\cfusion.story.luau"]}]},{"name":"OutlinedButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedButton\\cfusion.story.luau"]}]},{"name":"OutlinedIconButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedIconButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedIconButton\\cfusion.story.luau"]}]},{"name":"Segmented","className":"ModuleScript","filePaths":["src\\Component\\Button\\Segmented\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\Segmented\\cfusion.story.luau"]}]},{"name":"TextButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\TextButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\TextButton\\cfusion.story.luau"]}]}]}]},{"name":"Config","className":"ModuleScript","filePaths":["src\\Config.luau"]},{"name":"Enums","className":"ModuleScript","filePaths":["src\\Enums.luau"]},{"name":"Sounds","className":"ModuleScript","filePaths":["src\\Sounds.luau"]},{"name":"Test","className":"Folder","children":[{"name":"Source.cfusion","className":"ModuleScript","filePaths":["src\\Test\\Source.cfusion.luau"]}]},{"name":"Types","className":"ModuleScript","filePaths":["src\\Types.luau"]},{"name":"Util","className":"ModuleScript","filePaths":["src\\Util.luau"]}]}]}]}]} \ No newline at end of file +{"name":"synthetic-test","className":"DataModel","filePaths":["dev.project.json"],"children":[{"name":"ReplicatedStorage","className":"ReplicatedStorage","children":[{"name":"Packages","className":"Folder","children":[{"name":"ColdFusion","className":"ModuleScript","filePaths":["Packages\\ColdFusion.lua"]},{"name":"CurveUtil","className":"ModuleScript","filePaths":["Packages\\CurveUtil.lua"]},{"name":"Format","className":"ModuleScript","filePaths":["Packages\\Format.lua"]},{"name":"Fusion","className":"ModuleScript","filePaths":["Packages\\Fusion.lua"]},{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\Maid.lua"]},{"name":"MaterialIcons","className":"ModuleScript","filePaths":["Packages\\MaterialIcons.lua"]},{"name":"MeshUtil","className":"ModuleScript","filePaths":["Packages\\MeshUtil.lua"]},{"name":"Roact","className":"ModuleScript","filePaths":["Packages\\Roact.lua"]},{"name":"Signal","className":"ModuleScript","filePaths":["Packages\\Signal.lua"]},{"name":"_Index","className":"Folder","children":[{"name":"elttob_fusion@0.2.0","className":"Folder","children":[{"name":"fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\init.lua","Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\default.project.json"],"children":[{"name":"Animation","className":"Folder","children":[{"name":"Spring","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\Spring.lua"]},{"name":"SpringScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\SpringScheduler.lua"]},{"name":"Tween","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\Tween.lua"]},{"name":"TweenScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\TweenScheduler.lua"]},{"name":"getTweenRatio","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\getTweenRatio.lua"]},{"name":"lerpType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\lerpType.lua"]},{"name":"packType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\packType.lua"]},{"name":"springCoefficients","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\springCoefficients.lua"]},{"name":"unpackType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\unpackType.lua"]}]},{"name":"Colour","className":"Folder","children":[{"name":"Oklab","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Colour\\Oklab.lua"]}]},{"name":"Dependencies","className":"Folder","children":[{"name":"captureDependencies","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\captureDependencies.lua"]},{"name":"initDependency","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\initDependency.lua"]},{"name":"sharedState","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\sharedState.lua"]},{"name":"updateAll","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\updateAll.lua"]},{"name":"useDependency","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\useDependency.lua"]}]},{"name":"Instances","className":"Folder","children":[{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Children.lua"]},{"name":"Cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Cleanup.lua"]},{"name":"Hydrate","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Hydrate.lua"]},{"name":"New","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\New.lua"]},{"name":"OnChange","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\OnChange.lua"]},{"name":"OnEvent","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\OnEvent.lua"]},{"name":"Out","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Out.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Ref.lua"]},{"name":"applyInstanceProps","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\applyInstanceProps.lua"]},{"name":"defaultProps","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\defaultProps.lua"]}]},{"name":"Logging","className":"Folder","children":[{"name":"logError","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logError.lua"]},{"name":"logErrorNonFatal","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logErrorNonFatal.lua"]},{"name":"logWarn","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logWarn.lua"]},{"name":"messages","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\messages.lua"]},{"name":"parseError","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\parseError.lua"]}]},{"name":"PubTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\PubTypes.lua"]},{"name":"State","className":"Folder","children":[{"name":"Computed","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Computed.lua"]},{"name":"ForKeys","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForKeys.lua"]},{"name":"ForPairs","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForPairs.lua"]},{"name":"ForValues","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForValues.lua"]},{"name":"Observer","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Observer.lua"]},{"name":"Value","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Value.lua"]},{"name":"unwrap","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\unwrap.lua"]}]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Types.lua"]},{"name":"Utility","className":"Folder","children":[{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\None.lua"]},{"name":"cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\cleanup.lua"]},{"name":"doNothing","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\doNothing.lua"]},{"name":"isSimilar","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\isSimilar.lua"]},{"name":"needsDestruction","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\needsDestruction.lua"]},{"name":"restrictRead","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\restrictRead.lua"]},{"name":"xtypeof","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\xtypeof.lua"]}]}]}]},{"name":"nightcycle_cold-fusion@9.0.7","className":"Folder","children":[{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\Maid.lua"]},{"name":"ServiceProxy","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\ServiceProxy.lua"]},{"name":"Signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\Signal.lua"]},{"name":"TableUtil","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\TableUtil.lua"]},{"name":"cold-fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\init.luau","Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\default.project.json"],"children":[{"name":"Fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\init.lua"],"children":[{"name":"Animation","className":"Folder","children":[{"name":"Spring","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\Spring.lua"]},{"name":"SpringScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\SpringScheduler.lua"]},{"name":"Tween","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\Tween.lua"]},{"name":"TweenScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\TweenScheduler.lua"]},{"name":"getTweenRatio","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\getTweenRatio.lua"]},{"name":"lerpType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\lerpType.lua"]},{"name":"packType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\packType.lua"]},{"name":"springCoefficients","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\springCoefficients.lua"]},{"name":"unpackType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\unpackType.lua"]}]},{"name":"Colour","className":"Folder","children":[{"name":"Oklab","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Colour\\Oklab.lua"]}]},{"name":"Instances","className":"Folder","children":[{"name":"Attribute","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Attribute.lua"]},{"name":"AttributeChange","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\AttributeChange.lua"]},{"name":"AttributeOut","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\AttributeOut.lua"]},{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Children.lua"]},{"name":"Cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Cleanup.lua"]},{"name":"Hydrate","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Hydrate.lua"]},{"name":"New","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\New.lua"]},{"name":"OnChange","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\OnChange.lua"]},{"name":"OnEvent","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\OnEvent.lua"]},{"name":"Out","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Out.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Ref.lua"]},{"name":"applyInstanceProps","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\applyInstanceProps.lua"]},{"name":"defaultProps","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\defaultProps.lua"]}]},{"name":"Logging","className":"Folder","children":[{"name":"logError","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logError.lua"]},{"name":"logErrorNonFatal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logErrorNonFatal.lua"]},{"name":"logWarn","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logWarn.lua"]},{"name":"messages","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\messages.lua"]},{"name":"parseError","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\parseError.lua"]}]},{"name":"PubTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\PubTypes.lua"]},{"name":"State","className":"Folder","children":[{"name":"Computed","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Computed.lua"]},{"name":"ForKeys","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForKeys.lua"]},{"name":"ForPairs","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForPairs.lua"]},{"name":"ForValues","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForValues.lua"]},{"name":"Observer","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Observer.lua"]},{"name":"Value","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Value.lua"]},{"name":"isState","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\isState.lua"]},{"name":"makeUseCallback","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\makeUseCallback.lua"]},{"name":"peek","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\peek.lua"]},{"name":"updateAll","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\updateAll.lua"]}]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Types.lua"]},{"name":"Utility","className":"Folder","children":[{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\None.lua"]},{"name":"cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\cleanup.lua"]},{"name":"doNothing","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\doNothing.lua"]},{"name":"isSimilar","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\isSimilar.lua"]},{"name":"needsDestruction","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\needsDestruction.lua"]},{"name":"restrictRead","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\restrictRead.lua"]},{"name":"xtypeof","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\xtypeof.lua"]}]}]},{"name":"InstanceTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\InstanceTypes.luau"]},{"name":"Interface","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Interface.luau"]},{"name":"Test.story","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Test.story.luau"]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Types.luau"]},{"name":"Util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Util.luau"]}]}]},{"name":"nightcycle_curve-util@1.0.0","className":"Folder","children":[{"name":"Vector","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\Vector.lua"]},{"name":"curve-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\init.lua","Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\default.project.json"],"children":[{"name":"Ease","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\Ease.lua"]},{"name":"Lerp","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\Lerp.lua"]}]}]},{"name":"nightcycle_format@0.1.3","className":"Folder","children":[{"name":"format","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\init.lua","Packages\\_Index\\nightcycle_format@0.1.3\\format\\default.project.json"],"children":[{"name":"Emoji","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\Emoji.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\init.spec.lua"]}]},{"name":"maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\maid.lua"]},{"name":"signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\signal.lua"]},{"name":"string","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\string.lua"]}]},{"name":"nightcycle_geometry-util@1.1.1","className":"Folder","children":[{"name":"geometry-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\init.lua","Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\default.project.json"],"children":[{"name":"Earcut","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\Earcut\\init.lua"],"children":[{"name":"ZeroArray","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\Earcut\\ZeroArray.lua"]}]}]}]},{"name":"nightcycle_maid@1.1.4","className":"Folder","children":[{"name":"maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\init.lua","Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\default.project.json"],"children":[{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\Maid.lua"]},{"name":"MaidTaskUtils","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\MaidTaskUtils.lua"]}]}]},{"name":"nightcycle_material-icons@1.0.1","className":"Folder","children":[{"name":"material-icons","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\init.luau","Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\default.project.json"],"children":[{"name":"Default_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_1.luau"]},{"name":"Default_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_2.luau"]},{"name":"Default_18_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_3.luau"]},{"name":"Default_18_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_4.luau"]},{"name":"Default_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_1.luau"]},{"name":"Default_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_2.luau"]},{"name":"Default_24_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_3.luau"]},{"name":"Default_24_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_4.luau"]},{"name":"Default_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_1.luau"]},{"name":"Default_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_2.luau"]},{"name":"Default_36_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_3.luau"]},{"name":"Default_36_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_4.luau"]},{"name":"Default_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_1.luau"]},{"name":"Default_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_2.luau"]},{"name":"Default_48_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_3.luau"]},{"name":"Default_48_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_4.luau"]},{"name":"Outlined_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_18_1.luau"]},{"name":"Outlined_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_18_2.luau"]},{"name":"Outlined_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_24_1.luau"]},{"name":"Outlined_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_24_2.luau"]},{"name":"Outlined_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_36_1.luau"]},{"name":"Outlined_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_36_2.luau"]},{"name":"Outlined_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_48_1.luau"]},{"name":"Outlined_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_48_2.luau"]},{"name":"Round_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_18_1.luau"]},{"name":"Round_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_18_2.luau"]},{"name":"Round_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_24_1.luau"]},{"name":"Round_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_24_2.luau"]},{"name":"Round_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_36_1.luau"]},{"name":"Round_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_36_2.luau"]},{"name":"Round_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_48_1.luau"]},{"name":"Round_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_48_2.luau"]},{"name":"Sharp_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_18_1.luau"]},{"name":"Sharp_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_18_2.luau"]},{"name":"Sharp_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_24_1.luau"]},{"name":"Sharp_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_24_2.luau"]},{"name":"Sharp_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_36_1.luau"]},{"name":"Sharp_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_36_2.luau"]},{"name":"Sharp_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_48_1.luau"]},{"name":"Sharp_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_48_2.luau"]},{"name":"TwoTone_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_18_1.luau"]},{"name":"TwoTone_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_18_2.luau"]},{"name":"TwoTone_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_24_1.luau"]},{"name":"TwoTone_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_24_2.luau"]},{"name":"TwoTone_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_36_1.luau"]},{"name":"TwoTone_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_36_2.luau"]},{"name":"TwoTone_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_48_1.luau"]},{"name":"TwoTone_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_48_2.luau"]}]}]},{"name":"nightcycle_mesh-util@1.0.3","className":"Folder","children":[{"name":"GeometryUtil","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\GeometryUtil.lua"]},{"name":"mesh-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\init.lua","Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\default.project.json"],"children":[{"name":"CornerWedgePart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\CornerWedgePart.lua"]},{"name":"Part","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\Part.lua"]},{"name":"TetraPart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\TetraPart.lua"]},{"name":"WedgePart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\WedgePart.lua"]}]}]},{"name":"nightcycle_service-proxy@1.0.0","className":"Folder","children":[{"name":"service-proxy","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_service-proxy@1.0.0\\service-proxy\\src\\init.lua","Packages\\_Index\\nightcycle_service-proxy@1.0.0\\service-proxy\\default.project.json"]}]},{"name":"nightcycle_signal@1.0.2","className":"Folder","children":[{"name":"signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_signal@1.0.2\\signal\\src\\init.lua","Packages\\_Index\\nightcycle_signal@1.0.2\\signal\\default.project.json"]}]},{"name":"nightcycle_string@0.1.0","className":"Folder","children":[{"name":"string","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_string@0.1.0\\string\\src\\init.lua","Packages\\_Index\\nightcycle_string@0.1.0\\string\\default.project.json"],"children":[{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_string@0.1.0\\string\\src\\init.spec.lua"]}]}]},{"name":"nightcycle_table-util@1.1.0","className":"Folder","children":[{"name":"table-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_table-util@1.1.0\\table-util\\src\\init.lua","Packages\\_Index\\nightcycle_table-util@1.1.0\\table-util\\default.project.json"]}]},{"name":"nightcycle_vector@1.0.2","className":"Folder","children":[{"name":"vector","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_vector@1.0.2\\vector\\src\\init.lua","Packages\\_Index\\nightcycle_vector@1.0.2\\vector\\default.project.json"]}]},{"name":"roblox_roact@1.4.4","className":"Folder","children":[{"name":"roact","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\init.lua","Packages\\_Index\\roblox_roact@1.4.4\\roact\\default.project.json"],"children":[{"name":"Binding","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Binding.lua"]},{"name":"Binding.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Binding.spec.lua"]},{"name":"Component","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.lua"]},{"name":"Component.spec","className":"Folder","children":[{"name":"context.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\context.spec.lua"]},{"name":"defaultProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\defaultProps.spec.lua"]},{"name":"didMount.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\didMount.spec.lua"]},{"name":"didUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\didUpdate.spec.lua"]},{"name":"extend.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\extend.spec.lua"]},{"name":"getDerivedStateFromProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\getDerivedStateFromProps.spec.lua"]},{"name":"getElementTraceback.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\getElementTraceback.spec.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\init.spec.lua"]},{"name":"legacyContext.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\legacyContext.spec.lua"]},{"name":"render.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\render.spec.lua"]},{"name":"setState.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\setState.spec.lua"]},{"name":"shouldUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\shouldUpdate.spec.lua"]},{"name":"validateProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\validateProps.spec.lua"]},{"name":"willUnmount.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\willUnmount.spec.lua"]},{"name":"willUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\willUpdate.spec.lua"]}]},{"name":"ComponentLifecyclePhase","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ComponentLifecyclePhase.lua"]},{"name":"Config","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Config.lua"]},{"name":"Config.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Config.spec.lua"]},{"name":"ElementKind","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementKind.lua"]},{"name":"ElementKind.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementKind.spec.lua"]},{"name":"ElementUtils","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementUtils.lua"]},{"name":"ElementUtils.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementUtils.spec.lua"]},{"name":"GlobalConfig","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\GlobalConfig.lua"]},{"name":"GlobalConfig.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\GlobalConfig.spec.lua"]},{"name":"Logging","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Logging.lua"]},{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\None.lua"]},{"name":"NoopRenderer","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\NoopRenderer.lua"]},{"name":"Portal","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Portal.lua"]},{"name":"PropMarkers","className":"Folder","children":[{"name":"Change","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Change.lua"]},{"name":"Change.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Change.spec.lua"]},{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Children.lua"]},{"name":"Event","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Event.lua"]},{"name":"Event.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Event.spec.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Ref.lua"]}]},{"name":"PureComponent","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PureComponent.lua"]},{"name":"PureComponent.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PureComponent.spec.lua"]},{"name":"RobloxRenderer","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\RobloxRenderer.lua"]},{"name":"RobloxRenderer.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\RobloxRenderer.spec.lua"]},{"name":"SingleEventManager","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\SingleEventManager.lua"]},{"name":"SingleEventManager.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\SingleEventManager.spec.lua"]},{"name":"Symbol","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Symbol.lua"]},{"name":"Symbol.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Symbol.spec.lua"]},{"name":"Type","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Type.lua"]},{"name":"Type.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Type.spec.lua"]},{"name":"assertDeepEqual","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assertDeepEqual.lua"]},{"name":"assertDeepEqual.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assertDeepEqual.spec.lua"]},{"name":"assign","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assign.lua"]},{"name":"assign.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assign.spec.lua"]},{"name":"createContext","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createContext.lua"]},{"name":"createContext.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createContext.spec.lua"]},{"name":"createElement","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createElement.lua"]},{"name":"createElement.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createElement.spec.lua"]},{"name":"createFragment","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createFragment.lua"]},{"name":"createFragment.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createFragment.spec.lua"]},{"name":"createReconciler","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconciler.lua"]},{"name":"createReconciler.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconciler.spec.lua"]},{"name":"createReconcilerCompat","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconcilerCompat.lua"]},{"name":"createReconcilerCompat.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconcilerCompat.spec.lua"]},{"name":"createRef","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createRef.lua"]},{"name":"createRef.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createRef.spec.lua"]},{"name":"createSignal","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSignal.lua"]},{"name":"createSignal.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSignal.spec.lua"]},{"name":"createSpy","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSpy.lua"]},{"name":"createSpy.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSpy.spec.lua"]},{"name":"forwardRef","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\forwardRef.lua"]},{"name":"forwardRef.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\forwardRef.spec.lua"]},{"name":"getDefaultInstanceProperty","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\getDefaultInstanceProperty.lua"]},{"name":"getDefaultInstanceProperty.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\getDefaultInstanceProperty.spec.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\init.spec.lua"]},{"name":"internalAssert","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\internalAssert.lua"]},{"name":"invalidSetStateMessages","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\invalidSetStateMessages.lua"]},{"name":"oneChild","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\oneChild.lua"]},{"name":"oneChild.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\oneChild.spec.lua"]},{"name":"strict","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\strict.lua"]},{"name":"strict.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\strict.spec.lua"]}]}]}]},{"name":"synthetic","className":"ModuleScript","filePaths":["src\\init.luau"],"children":[{"name":"Component","className":"Folder","children":[{"name":"Button","className":"Folder","children":[{"name":"Badge","className":"ModuleScript","filePaths":["src\\Component\\Button\\Badge\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\Badge\\cfusion.story.luau"]}]},{"name":"Base","className":"ModuleScript","filePaths":["src\\Component\\Button\\Base.luau"]},{"name":"ElevatedButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\ElevatedButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\ElevatedButton\\cfusion.story.luau"]}]},{"name":"ExtendedFAB","className":"ModuleScript","filePaths":["src\\Component\\Button\\ExtendedFAB\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\ExtendedFAB\\cfusion.story.luau"]}]},{"name":"FAB","className":"ModuleScript","filePaths":["src\\Component\\Button\\FAB\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\FAB\\cfusion.story.luau"]}]},{"name":"FilledButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledButton\\cfusion.story.luau"]}]},{"name":"FilledIconButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledIconButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledIconButton\\cfusion.story.luau"]}]},{"name":"IconButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\IconButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\IconButton\\cfusion.story.luau"]}]},{"name":"OutlinedButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedButton\\cfusion.story.luau"]}]},{"name":"OutlinedIconButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedIconButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedIconButton\\cfusion.story.luau"]}]},{"name":"Segmented","className":"ModuleScript","filePaths":["src\\Component\\Button\\Segmented\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\Segmented\\cfusion.story.luau"]}]},{"name":"TextButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\TextButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\TextButton\\cfusion.story.luau"]}]}]}]},{"name":"Config","className":"ModuleScript","filePaths":["src\\Config.luau"]},{"name":"Enums","className":"ModuleScript","filePaths":["src\\Enums.luau"]},{"name":"Sounds","className":"ModuleScript","filePaths":["src\\Sounds.luau"]},{"name":"Test","className":"Folder","children":[{"name":"Source.cfusion","className":"ModuleScript","filePaths":["src\\Test\\Source.cfusion.luau"]}]},{"name":"Types","className":"ModuleScript","filePaths":["src\\Types.luau"]},{"name":"Util","className":"ModuleScript","filePaths":["src\\Util.luau"]}]}]}]}]} \ No newline at end of file diff --git a/src/Component/Button/Badge/cfusion.story.luau b/src/Component/Button/Badge/cfusion.story.luau new file mode 100644 index 00000000..6efead3b --- /dev/null +++ b/src/Component/Button/Badge/cfusion.story.luau @@ -0,0 +1,117 @@ +--!strict +local _Package = script.Parent.Parent.Parent.Parent +local _Packages = _Package.Parent +-- Services +-- Packages +local Maid = require(_Packages:WaitForChild("Maid")) +local MaterialIcons = require(_Packages:WaitForChild("MaterialIcons")) + +-- Modules +local Types = require(_Package:WaitForChild("Types")) +-- Types +-- Constants +local SCALE = 1.2 +-- Variables +-- References +local Icons = MaterialIcons.default.dp_48.scale_1 + +-- Class +return function(frame: Frame) + local maid = Maid.new() + task.spawn(function() + local function makeHalfFrame(isDarkMode: boolean, color: Color3): Frame + local halfFrame = maid:GiveTask(Instance.new("Frame")) + halfFrame.BackgroundColor3 = if isDarkMode + then Color3.new(0.15, 0.15, 0.15) + else Color3.new(0.85, 0.85, 0.85) + + local listLayout = maid:GiveTask(Instance.new("UIListLayout")) + listLayout.FillDirection = Enum.FillDirection.Vertical + listLayout.Padding = UDim.new(0, 10) + listLayout.VerticalAlignment = Enum.VerticalAlignment.Center + listLayout.HorizontalAlignment = Enum.HorizontalAlignment.Center + listLayout.Parent = halfFrame + + local img = Types.newImageData( + Icons.voice_chat.Image, + Icons.voice_chat.ImageRectOffset, + Icons.voice_chat.ImageRectSize + ) + + local Module = require(script.Parent) + local theme = Types.newThemeData( + 1, + isDarkMode, + SCALE, + Font.fromEnum(Enum.Font.SourceSans), + color, + halfFrame.BackgroundColor3 + ) + + do + local button = maid:GiveTask(Module.cfusion(function() + print("click nil") + end, img, "Badge nil", nil, theme)) + button.Parent = halfFrame + end + do + local button = maid:GiveTask(Module.cfusion(function() + print("click 0") + end, img, "Badge 0", 0, theme)) + button.Parent = halfFrame + end + do + local button = maid:GiveTask(Module.cfusion(function() + print("click 1") + end, img, "Badge 1", 1, theme)) + button.Parent = halfFrame + end + do + local button = maid:GiveTask(Module.cfusion(function() + print("click 64") + end, img, "Badge 64", 64, theme)) + button.Parent = halfFrame + end + do + local button = maid:GiveTask(Module.cfusion(function() + print("click 360") + end, img, "Badge 360", 360, theme)) + button.Parent = halfFrame + end + do + local button = maid:GiveTask(Module.cfusion(function() + print("click 1024") + end, img, "Badge 1024", 1024, theme)) + button.Parent = halfFrame + end + return halfFrame + end + + local COLORS: { [number]: Color3 } = { + Color3.fromHSV(0, 0.9, 0.8), + Color3.fromHSV(0, 0.25, 0.8), + Color3.fromHSV(0, 0.9, 0.5), + Color3.fromHSV(0.6, 0.9, 0.7), + Color3.fromHSV(0.35, 0.9, 0.7), + Color3.fromHSV(0.1, 0.9, 0.7), + } + + for i, color in ipairs(COLORS) do + local x = (i - 1) / #COLORS + local width = 1 / #COLORS + local dark = makeHalfFrame(true, color) + + dark.Size = UDim2.fromScale(width, 0.5) + dark.Position = UDim2.fromScale(x, 0.5) + dark.Parent = frame + + local bright = makeHalfFrame(false, color) + bright.Size = UDim2.fromScale(width, 0.5) + bright.Position = UDim2.fromScale(x, 0) + bright.Parent = frame + end + end) + return function() + maid:Destroy() + end +end diff --git a/src/Component/Button/Badge/init.luau b/src/Component/Button/Badge/init.luau new file mode 100644 index 00000000..e124c124 --- /dev/null +++ b/src/Component/Button/Badge/init.luau @@ -0,0 +1,469 @@ +--!strict +local _Package = script.Parent.Parent.Parent +local _Packages = _Package.Parent +-- Services +local SoundService = game:GetService("SoundService") +-- Packages +local Maid = require(_Packages:WaitForChild("Maid")) +local ColdFusion = require(_Packages:WaitForChild("ColdFusion")) + +-- Modules +local Sounds = require(_Package:WaitForChild("Sounds")) +local Enums = require(_Package:WaitForChild("Enums")) +local Types = require(_Package:WaitForChild("Types")) +local Config = require(_Package:WaitForChild("Config")) +local Util = require(_Package:WaitForChild("Util")) + +-- Types +type Maid = Maid.Maid +type State = ColdFusion.State +type ValueState = ColdFusion.ValueState +type CanBeState = ColdFusion.CanBeState +type TextStyle = Types.TextStyle +type ImageData = Types.ImageData +type ThemeData = Types.ThemeData +-- Constants +local DEFAULT_VOLUME = Config.Sound.Volume +local HOVER_TRANSPARENCY = Config.Transparency.Background.Hovered +local FOCUS_TRANSPARENCY = Config.Transparency.Background.Focused +local PRESS_TRANSPARENCY = Config.Transparency.Background.Pressed +local DISABLE_TRANSPARENCY = Config.Transparency.Text.Disabled +local LABEL_TEXT_ALIGNMENT = Enum.TextXAlignment.Center +local ICON_SIZE_DP = 20 +local ICON_PAD_DP = 6 +local PAD_DP = 4 +local TXT_HEIGHT_DP = 14 +local BADGE_PAD_DP = 3 +local BADGE_TXT_HEIGHT_DP = 18 + +-- Variables +-- References +-- Private Functions +function new( + maid: Maid, + onClick: CanBeState<() -> ()>, + font: CanBeState, + label: CanBeState, + styles: CanBeState<{ [Enums.ButtonStateType]: TextStyle }>, + icon: CanBeState, + count: CanBeState, + scale: CanBeState, + sound: CanBeState +): TextButton + + local _fuse = ColdFusion.fuse(maid) + + local _new = _fuse.new + local _bind = _fuse.bind + local _clone = _fuse.clone + local _import = _fuse.import + + local _Value = _fuse.Value + local _Computed = _fuse.Computed + + local scaleState = _import(scale, 1) + local fontState = _import(font, Font.fromEnum(Enum.Font.SourceSans)) + local labelState = _import(label, "") + local soundState = _import(sound, nil :: Sound?) + local countState = _import(count, nil :: number?) + local iconState: State = _import(icon, nil :: any) + local onClickState = _import(onClick, function() end) + local isEnabledState = _Value(true) + local isFocusedState = _Value(false) + local isPressedState = _Value(false) + local isHoveredState = _Value(false) + local currentStateState = _Computed( + function( + isEnab: boolean, + isFocused: boolean, + isPressed: boolean, + isHovered: boolean + ): Enums.ButtonStateType + if isEnab then + if isPressed then + return Enums.ButtonStateType.Pressed + else + if isHovered then + return Enums.ButtonStateType.Hovered + else + if isFocused then + return Enums.ButtonStateType.Focused + else + return Enums.ButtonStateType.Enabled + end + end + end + else + return Enums.ButtonStateType.Disabled + end + end, + isEnabledState, + isFocusedState, + isPressedState, + isHoveredState + ) :: State + + local stylesState = _import(styles, {}) :: any + local currentStyleState = _Computed( + function(state: Enums.ButtonStateType, styles: { [Enums.ButtonStateType]: TextStyle }): TextStyle + local style = styles[state] + assert(style ~= nil, `no style for {state}`) + return style + end, + currentStateState, + stylesState + ) + + local inst = _new("TextButton")({ + Text = "", + Size = UDim2.new(0,0), + AutomaticSize = Enum.AutomaticSize.XY, + BackgroundTransparency = 1, + Events = { + Activated = function() + if isEnabledState:Get() == false then + return + end + local click = onClickState:Get() + local s = soundState:Get() + if s then + SoundService:PlayLocalSound(s) + end + click() + end, + MouseButton1Down = function(x: number, y: number) + if isEnabledState:Get() == false then + return + end + isPressedState:Set(true) + end, + MouseButton1Up = function(x: number, y: number) + if isEnabledState:Get() == false then + return + end + isPressedState:Set(false) + end, + MouseEnter = function() + isHoveredState:Set(true) + end, + MouseLeave = function() + isHoveredState:Set(false) + end, + SelectionGained = function() + isFocusedState:Set(true) + end, + SelectionLost = function() + isFocusedState:Set(false) + end, + }, + Children = { + _new("UIListLayout")({ + Padding = _Computed(function(s: number): UDim + return UDim.new(0, s*PAD_DP) + end, scaleState), + SortOrder = Enum.SortOrder.LayoutOrder, + FillDirection = Enum.FillDirection.Vertical, + ItemLineAlignment = Enum.ItemLineAlignment.Center, + VerticalAlignment = Enum.VerticalAlignment.Center, + HorizontalAlignment = Enum.HorizontalAlignment.Center, + }), + _new("TextLabel")({ + Text = labelState, + Visible = _Computed(function(txt: string): boolean + return txt:len() > 0 + end, labelState), + TextScaled = true, + TextXAlignment = LABEL_TEXT_ALIGNMENT, + TextYAlignment = Enum.TextYAlignment.Center, + BackgroundTransparency = 1, + AutomaticSize = Enum.AutomaticSize.X, + FontFace = fontState, + LayoutOrder = 2, + TextColor3 = _Computed(function(style: TextStyle): Color3 + return style.TextColor3 + end, currentStyleState), + TextTransparency = _Computed(function(style: TextStyle): number + return style.TextTransparency + end, currentStyleState), + Size = _Computed(function(s: number): UDim2 + return UDim2.fromOffset(0, s * TXT_HEIGHT_DP) + end, scaleState), + }), + _new("Frame")({ + Name = "Icon", + LayoutOrder = 1, + BackgroundColor3 = _Computed(function(style: TextStyle): Color3 + return style.BackgroundColor3 + end, currentStyleState), + BackgroundTransparency = _Computed(function(style: TextStyle): number + return style.BackgroundTransparency + end, currentStyleState), + AutomaticSize = Enum.AutomaticSize.XY, + Size = UDim2.fromOffset(0,0), + Children = { + _new("UIPadding")({ + PaddingLeft = _Computed(function(s: number): UDim + return UDim.new(0, s*ICON_PAD_DP*3) + end, scaleState), + PaddingRight = _Computed(function(s: number): UDim + return UDim.new(0, s*ICON_PAD_DP*3) + end, scaleState), + PaddingTop = _Computed(function(s: number): UDim + return UDim.new(0, s*ICON_PAD_DP) + end, scaleState), + PaddingBottom = _Computed(function(s: number): UDim + return UDim.new(0, s*ICON_PAD_DP) + end, scaleState), + }), + _new("UIListLayout")({ + Padding = UDim.new(0, 0), + SortOrder = Enum.SortOrder.LayoutOrder, + FillDirection = Enum.FillDirection.Vertical, + ItemLineAlignment = Enum.ItemLineAlignment.Center, + VerticalAlignment = Enum.VerticalAlignment.Center, + HorizontalAlignment = Enum.HorizontalAlignment.Center, + }), + _new("UICorner")({ + CornerRadius = UDim.new(0.5,0) + }), + _new("ImageLabel")({ + Name = "Icon", + LayoutOrder = 1, + BackgroundTransparency = 1, + ImageColor3 = _Computed(function(style: TextStyle): Color3 + return style.BorderColor3 + end, currentStyleState), + ImageTransparency = _Computed(function(style: TextStyle): number + return style.BorderTransparency + end, currentStyleState), + Image = _Computed(function(icon: ImageData): string + return icon.Image + end, iconState), + ImageRectOffset = _Computed(function(icon: ImageData): Vector2 + return icon.ImageRectOffset + end, iconState), + ImageRectSize = _Computed(function(icon: ImageData): Vector2 + return icon.ImageRectSize + end, iconState), + Size = _Computed(function(s: number): UDim2 + return UDim2.fromOffset(s * ICON_SIZE_DP, s * ICON_SIZE_DP) + end, scaleState), + Children = { + _new("TextLabel")({ + Position = _Computed(function(s: number, c: number?): UDim2 + if c == nil then + return UDim2.new(1, -0.25*BADGE_TXT_HEIGHT_DP, 0, 0) + else + return UDim2.new(0.5, s, 0, 0) + end + end, scaleState, countState), + AnchorPoint = Vector2.new(0,0.5), + AutomaticSize = Enum.AutomaticSize.None, + Visible = _Computed(function(c: number?): boolean + return c ~= 0 + end, countState), + Size = _Computed(function(c: number?, s: number): UDim2 + local x = BADGE_TXT_HEIGHT_DP + if c ~= nil then + if c > 999 then + x += 15 + elseif c > 99 then + x += 10 + elseif c > 9 then + x += 5 + end + else + s *= 0.5 + end + return UDim2.fromOffset( + s * x, + s * BADGE_TXT_HEIGHT_DP + ) + end, countState, scaleState), + TextScaled = true, + RichText = true, + Text = _Computed(function(c: number?): string + if c and c > 0 then + if c < 999 then + return `{c}` + else + return `999+` + end + else + return "" + end + end, countState), + FontFace = fontState, + BackgroundColor3 = _Computed(function(style: TextStyle): Color3 + return Util.getReadableColor(style.BackgroundColor3, Util.LIGHT_SURFACE) + end, currentStyleState), + TextColor3 = Util.LIGHT_SURFACE, + Children = { + _new("UIPadding")({ + PaddingLeft = _Computed(function(s: number): UDim + return UDim.new(0, s*BADGE_PAD_DP) + end, scaleState), + PaddingRight = _Computed(function(s: number): UDim + return UDim.new(0, s*BADGE_PAD_DP) + end, scaleState), + PaddingBottom = _Computed(function(s: number): UDim + return UDim.new(0, s*BADGE_PAD_DP) + end, scaleState), + }), + _new("UICorner")({ + CornerRadius = UDim.new(0.5,0) + }), + }, + }) + } + }), + } + }), + + }, + }) :: TextButton + return inst +end + +-- Class +local Interface = {} + +function Interface.cfusion( + onClick: CanBeState<() -> ()>, + icon: CanBeState, + label: CanBeState, + count: CanBeState, + theme: CanBeState +): TextButton + local maid = Maid.new() + + local _fuse = ColdFusion.fuse(maid) + + local _new = _fuse.new + local _bind = _fuse.bind + local _clone = _fuse.clone + local _import = _fuse.import + + local _Value = _fuse.Value + local _Computed = _fuse.Computed + + local onClickState = _import(onClick, function() end) + local themeState = _import( + theme, + Types.newThemeData( + 1, + false, + 1, + Font.fromEnum(Enum.Font.SourceSansSemibold), + Color3.fromHSV(0.8, 0.4, 0.8) + ) + ) + + local sound = maid:GiveTask(Instance.new("Sound")) + sound.Volume = DEFAULT_VOLUME + sound.SoundId = Sounds.ui_tap_variant_01 + + local styles = _Computed(function(thm: ThemeData): { [Enums.ButtonStateType]: TextStyle } + local color: Color3 = thm.Color3 + local textColor: Color3 + -- local borderColor: Color3 + if thm.IsDarkMode then + -- borderColor = Util.getReadableColor( + -- Util.LIGHT_SURFACE, + -- color, + -- 1 + -- ) + textColor = color:Lerp(Util.LIGHT_SURFACE, 0.8) + else + -- borderColor = Util.getReadableColor( + -- Util.LIGHT_SURFACE, + -- color, + -- 1 + -- ) + textColor = color:Lerp(Util.DARK_SURFACE, 0.8) + end + color = Util.getElevatedColor(color, thm.Elevation, thm.IsDarkMode) + -- borderColor = Util.getElevatedColor(borderColor, thm.Elevation, thm.IsDarkMode) + textColor = Util.getElevatedColor(textColor, thm.Elevation, thm.IsDarkMode) + + local data = { + [Enums.ButtonStateType.Enabled] = Types.newTextStyle( + textColor, + 0, + color, + 1, + textColor, + 0 + ), + [Enums.ButtonStateType.Disabled] = Types.newTextStyle( + textColor, + DISABLE_TRANSPARENCY, + (function(): Color3 + if thm.IsDarkMode then + local h, _s, v = color:ToHSV() + return Util.getReadableColor( + Color3.fromHSV(h, 0, v), + if thm.BackgroundColor3 then thm.BackgroundColor3 else Color3.new(0.15, 0.15, 0.15) + ) + else + local h, _s, v = color:ToHSV() + return Util.getReadableColor( + Color3.fromHSV(h, 0, v), + if thm.BackgroundColor3 then thm.BackgroundColor3 else Color3.new(0.85, 0.85, 0.85) + ) + end + end)(), + 1, + textColor, + DISABLE_TRANSPARENCY + ), + [Enums.ButtonStateType.Focused] = Types.newTextStyle( + textColor, + 0, + color, + FOCUS_TRANSPARENCY, + textColor, + 0 + ), + [Enums.ButtonStateType.Hovered] = Types.newTextStyle( + textColor, + 0, + color, + HOVER_TRANSPARENCY, + textColor, + 0 + ), + [Enums.ButtonStateType.Pressed] = Types.newTextStyle( + textColor, + 0, + color, + PRESS_TRANSPARENCY, + textColor, + 0 + ), + } + return data + end, themeState) + + local button = new( + maid, + onClickState, + _Computed(function(t: ThemeData): Font + return t.Font + end, themeState), + label, + styles, + icon, + count, + _Computed(function(t: ThemeData): number + return t.Scale + end, themeState), + sound + ) + + maid.bind(button) + + return button +end + +return Interface diff --git a/src/Component/Button/Base.luau b/src/Component/Button/Base.luau index 4f6333e2..40a1bd2f 100644 --- a/src/Component/Button/Base.luau +++ b/src/Component/Button/Base.luau @@ -66,12 +66,12 @@ return function( local isHoveredState = _Value(false) local currentStateState = _Computed( function( - isEnabled: boolean, + isEnab: boolean, isFocused: boolean, isPressed: boolean, isHovered: boolean ): Enums.ButtonStateType - if isEnabled then + if isEnab then if isPressed then return Enums.ButtonStateType.Pressed else diff --git a/src/Component/Button/Segmented/cfusion.story.luau b/src/Component/Button/Segmented/cfusion.story.luau index fb8cf4ec..47c5658d 100644 --- a/src/Component/Button/Segmented/cfusion.story.luau +++ b/src/Component/Button/Segmented/cfusion.story.luau @@ -8,7 +8,6 @@ local MaterialIcons = require(_Packages:WaitForChild("MaterialIcons")) -- Modules local Types = require(_Package:WaitForChild("Types")) -local Enums = require(_Package:WaitForChild("Enums")) -- Types -- Constants From 47f817540bf4ecc1131c082cc15c387fde89e611 Mon Sep 17 00:00:00 2001 From: Nightcycle <77173389+nightcycle@users.noreply.github.com> Date: Thu, 7 Dec 2023 12:06:01 -0500 Subject: [PATCH 16/57] Added bottom bar --- sourcemap.json | 2 +- src/Component/Bar/Bottom/cfusion.story.luau | 86 ++++ src/Component/Bar/Bottom/init.luau | 210 +++++++++ src/Component/Button/Base.luau | 444 ++++++++++---------- src/Types.luau | 20 + src/Util.luau | 8 +- src/init.luau | 35 ++ synthetic.rbxl.lock | 2 +- wally.lock | 2 +- wally.toml | 3 +- 10 files changed, 588 insertions(+), 224 deletions(-) create mode 100644 src/Component/Bar/Bottom/cfusion.story.luau create mode 100644 src/Component/Bar/Bottom/init.luau diff --git a/sourcemap.json b/sourcemap.json index d9167d7b..c7311d1d 100644 --- a/sourcemap.json +++ b/sourcemap.json @@ -1 +1 @@ -{"name":"synthetic-test","className":"DataModel","filePaths":["dev.project.json"],"children":[{"name":"ReplicatedStorage","className":"ReplicatedStorage","children":[{"name":"Packages","className":"Folder","children":[{"name":"ColdFusion","className":"ModuleScript","filePaths":["Packages\\ColdFusion.lua"]},{"name":"CurveUtil","className":"ModuleScript","filePaths":["Packages\\CurveUtil.lua"]},{"name":"Format","className":"ModuleScript","filePaths":["Packages\\Format.lua"]},{"name":"Fusion","className":"ModuleScript","filePaths":["Packages\\Fusion.lua"]},{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\Maid.lua"]},{"name":"MaterialIcons","className":"ModuleScript","filePaths":["Packages\\MaterialIcons.lua"]},{"name":"MeshUtil","className":"ModuleScript","filePaths":["Packages\\MeshUtil.lua"]},{"name":"Roact","className":"ModuleScript","filePaths":["Packages\\Roact.lua"]},{"name":"Signal","className":"ModuleScript","filePaths":["Packages\\Signal.lua"]},{"name":"_Index","className":"Folder","children":[{"name":"elttob_fusion@0.2.0","className":"Folder","children":[{"name":"fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\init.lua","Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\default.project.json"],"children":[{"name":"Animation","className":"Folder","children":[{"name":"Spring","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\Spring.lua"]},{"name":"SpringScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\SpringScheduler.lua"]},{"name":"Tween","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\Tween.lua"]},{"name":"TweenScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\TweenScheduler.lua"]},{"name":"getTweenRatio","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\getTweenRatio.lua"]},{"name":"lerpType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\lerpType.lua"]},{"name":"packType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\packType.lua"]},{"name":"springCoefficients","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\springCoefficients.lua"]},{"name":"unpackType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\unpackType.lua"]}]},{"name":"Colour","className":"Folder","children":[{"name":"Oklab","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Colour\\Oklab.lua"]}]},{"name":"Dependencies","className":"Folder","children":[{"name":"captureDependencies","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\captureDependencies.lua"]},{"name":"initDependency","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\initDependency.lua"]},{"name":"sharedState","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\sharedState.lua"]},{"name":"updateAll","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\updateAll.lua"]},{"name":"useDependency","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\useDependency.lua"]}]},{"name":"Instances","className":"Folder","children":[{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Children.lua"]},{"name":"Cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Cleanup.lua"]},{"name":"Hydrate","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Hydrate.lua"]},{"name":"New","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\New.lua"]},{"name":"OnChange","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\OnChange.lua"]},{"name":"OnEvent","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\OnEvent.lua"]},{"name":"Out","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Out.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Ref.lua"]},{"name":"applyInstanceProps","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\applyInstanceProps.lua"]},{"name":"defaultProps","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\defaultProps.lua"]}]},{"name":"Logging","className":"Folder","children":[{"name":"logError","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logError.lua"]},{"name":"logErrorNonFatal","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logErrorNonFatal.lua"]},{"name":"logWarn","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logWarn.lua"]},{"name":"messages","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\messages.lua"]},{"name":"parseError","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\parseError.lua"]}]},{"name":"PubTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\PubTypes.lua"]},{"name":"State","className":"Folder","children":[{"name":"Computed","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Computed.lua"]},{"name":"ForKeys","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForKeys.lua"]},{"name":"ForPairs","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForPairs.lua"]},{"name":"ForValues","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForValues.lua"]},{"name":"Observer","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Observer.lua"]},{"name":"Value","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Value.lua"]},{"name":"unwrap","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\unwrap.lua"]}]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Types.lua"]},{"name":"Utility","className":"Folder","children":[{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\None.lua"]},{"name":"cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\cleanup.lua"]},{"name":"doNothing","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\doNothing.lua"]},{"name":"isSimilar","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\isSimilar.lua"]},{"name":"needsDestruction","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\needsDestruction.lua"]},{"name":"restrictRead","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\restrictRead.lua"]},{"name":"xtypeof","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\xtypeof.lua"]}]}]}]},{"name":"nightcycle_cold-fusion@9.0.7","className":"Folder","children":[{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\Maid.lua"]},{"name":"ServiceProxy","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\ServiceProxy.lua"]},{"name":"Signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\Signal.lua"]},{"name":"TableUtil","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\TableUtil.lua"]},{"name":"cold-fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\init.luau","Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\default.project.json"],"children":[{"name":"Fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\init.lua"],"children":[{"name":"Animation","className":"Folder","children":[{"name":"Spring","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\Spring.lua"]},{"name":"SpringScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\SpringScheduler.lua"]},{"name":"Tween","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\Tween.lua"]},{"name":"TweenScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\TweenScheduler.lua"]},{"name":"getTweenRatio","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\getTweenRatio.lua"]},{"name":"lerpType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\lerpType.lua"]},{"name":"packType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\packType.lua"]},{"name":"springCoefficients","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\springCoefficients.lua"]},{"name":"unpackType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\unpackType.lua"]}]},{"name":"Colour","className":"Folder","children":[{"name":"Oklab","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Colour\\Oklab.lua"]}]},{"name":"Instances","className":"Folder","children":[{"name":"Attribute","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Attribute.lua"]},{"name":"AttributeChange","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\AttributeChange.lua"]},{"name":"AttributeOut","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\AttributeOut.lua"]},{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Children.lua"]},{"name":"Cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Cleanup.lua"]},{"name":"Hydrate","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Hydrate.lua"]},{"name":"New","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\New.lua"]},{"name":"OnChange","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\OnChange.lua"]},{"name":"OnEvent","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\OnEvent.lua"]},{"name":"Out","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Out.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Ref.lua"]},{"name":"applyInstanceProps","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\applyInstanceProps.lua"]},{"name":"defaultProps","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\defaultProps.lua"]}]},{"name":"Logging","className":"Folder","children":[{"name":"logError","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logError.lua"]},{"name":"logErrorNonFatal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logErrorNonFatal.lua"]},{"name":"logWarn","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logWarn.lua"]},{"name":"messages","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\messages.lua"]},{"name":"parseError","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\parseError.lua"]}]},{"name":"PubTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\PubTypes.lua"]},{"name":"State","className":"Folder","children":[{"name":"Computed","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Computed.lua"]},{"name":"ForKeys","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForKeys.lua"]},{"name":"ForPairs","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForPairs.lua"]},{"name":"ForValues","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForValues.lua"]},{"name":"Observer","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Observer.lua"]},{"name":"Value","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Value.lua"]},{"name":"isState","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\isState.lua"]},{"name":"makeUseCallback","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\makeUseCallback.lua"]},{"name":"peek","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\peek.lua"]},{"name":"updateAll","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\updateAll.lua"]}]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Types.lua"]},{"name":"Utility","className":"Folder","children":[{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\None.lua"]},{"name":"cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\cleanup.lua"]},{"name":"doNothing","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\doNothing.lua"]},{"name":"isSimilar","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\isSimilar.lua"]},{"name":"needsDestruction","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\needsDestruction.lua"]},{"name":"restrictRead","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\restrictRead.lua"]},{"name":"xtypeof","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\xtypeof.lua"]}]}]},{"name":"InstanceTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\InstanceTypes.luau"]},{"name":"Interface","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Interface.luau"]},{"name":"Test.story","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Test.story.luau"]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Types.luau"]},{"name":"Util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Util.luau"]}]}]},{"name":"nightcycle_curve-util@1.0.0","className":"Folder","children":[{"name":"Vector","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\Vector.lua"]},{"name":"curve-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\init.lua","Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\default.project.json"],"children":[{"name":"Ease","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\Ease.lua"]},{"name":"Lerp","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\Lerp.lua"]}]}]},{"name":"nightcycle_format@0.1.3","className":"Folder","children":[{"name":"format","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\init.lua","Packages\\_Index\\nightcycle_format@0.1.3\\format\\default.project.json"],"children":[{"name":"Emoji","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\Emoji.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\init.spec.lua"]}]},{"name":"maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\maid.lua"]},{"name":"signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\signal.lua"]},{"name":"string","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\string.lua"]}]},{"name":"nightcycle_geometry-util@1.1.1","className":"Folder","children":[{"name":"geometry-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\init.lua","Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\default.project.json"],"children":[{"name":"Earcut","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\Earcut\\init.lua"],"children":[{"name":"ZeroArray","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\Earcut\\ZeroArray.lua"]}]}]}]},{"name":"nightcycle_maid@1.1.4","className":"Folder","children":[{"name":"maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\init.lua","Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\default.project.json"],"children":[{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\Maid.lua"]},{"name":"MaidTaskUtils","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\MaidTaskUtils.lua"]}]}]},{"name":"nightcycle_material-icons@1.0.1","className":"Folder","children":[{"name":"material-icons","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\init.luau","Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\default.project.json"],"children":[{"name":"Default_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_1.luau"]},{"name":"Default_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_2.luau"]},{"name":"Default_18_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_3.luau"]},{"name":"Default_18_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_4.luau"]},{"name":"Default_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_1.luau"]},{"name":"Default_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_2.luau"]},{"name":"Default_24_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_3.luau"]},{"name":"Default_24_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_4.luau"]},{"name":"Default_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_1.luau"]},{"name":"Default_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_2.luau"]},{"name":"Default_36_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_3.luau"]},{"name":"Default_36_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_4.luau"]},{"name":"Default_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_1.luau"]},{"name":"Default_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_2.luau"]},{"name":"Default_48_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_3.luau"]},{"name":"Default_48_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_4.luau"]},{"name":"Outlined_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_18_1.luau"]},{"name":"Outlined_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_18_2.luau"]},{"name":"Outlined_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_24_1.luau"]},{"name":"Outlined_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_24_2.luau"]},{"name":"Outlined_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_36_1.luau"]},{"name":"Outlined_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_36_2.luau"]},{"name":"Outlined_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_48_1.luau"]},{"name":"Outlined_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_48_2.luau"]},{"name":"Round_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_18_1.luau"]},{"name":"Round_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_18_2.luau"]},{"name":"Round_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_24_1.luau"]},{"name":"Round_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_24_2.luau"]},{"name":"Round_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_36_1.luau"]},{"name":"Round_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_36_2.luau"]},{"name":"Round_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_48_1.luau"]},{"name":"Round_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_48_2.luau"]},{"name":"Sharp_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_18_1.luau"]},{"name":"Sharp_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_18_2.luau"]},{"name":"Sharp_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_24_1.luau"]},{"name":"Sharp_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_24_2.luau"]},{"name":"Sharp_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_36_1.luau"]},{"name":"Sharp_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_36_2.luau"]},{"name":"Sharp_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_48_1.luau"]},{"name":"Sharp_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_48_2.luau"]},{"name":"TwoTone_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_18_1.luau"]},{"name":"TwoTone_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_18_2.luau"]},{"name":"TwoTone_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_24_1.luau"]},{"name":"TwoTone_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_24_2.luau"]},{"name":"TwoTone_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_36_1.luau"]},{"name":"TwoTone_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_36_2.luau"]},{"name":"TwoTone_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_48_1.luau"]},{"name":"TwoTone_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_48_2.luau"]}]}]},{"name":"nightcycle_mesh-util@1.0.3","className":"Folder","children":[{"name":"GeometryUtil","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\GeometryUtil.lua"]},{"name":"mesh-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\init.lua","Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\default.project.json"],"children":[{"name":"CornerWedgePart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\CornerWedgePart.lua"]},{"name":"Part","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\Part.lua"]},{"name":"TetraPart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\TetraPart.lua"]},{"name":"WedgePart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\WedgePart.lua"]}]}]},{"name":"nightcycle_service-proxy@1.0.0","className":"Folder","children":[{"name":"service-proxy","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_service-proxy@1.0.0\\service-proxy\\src\\init.lua","Packages\\_Index\\nightcycle_service-proxy@1.0.0\\service-proxy\\default.project.json"]}]},{"name":"nightcycle_signal@1.0.2","className":"Folder","children":[{"name":"signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_signal@1.0.2\\signal\\src\\init.lua","Packages\\_Index\\nightcycle_signal@1.0.2\\signal\\default.project.json"]}]},{"name":"nightcycle_string@0.1.0","className":"Folder","children":[{"name":"string","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_string@0.1.0\\string\\src\\init.lua","Packages\\_Index\\nightcycle_string@0.1.0\\string\\default.project.json"],"children":[{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_string@0.1.0\\string\\src\\init.spec.lua"]}]}]},{"name":"nightcycle_table-util@1.1.0","className":"Folder","children":[{"name":"table-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_table-util@1.1.0\\table-util\\src\\init.lua","Packages\\_Index\\nightcycle_table-util@1.1.0\\table-util\\default.project.json"]}]},{"name":"nightcycle_vector@1.0.2","className":"Folder","children":[{"name":"vector","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_vector@1.0.2\\vector\\src\\init.lua","Packages\\_Index\\nightcycle_vector@1.0.2\\vector\\default.project.json"]}]},{"name":"roblox_roact@1.4.4","className":"Folder","children":[{"name":"roact","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\init.lua","Packages\\_Index\\roblox_roact@1.4.4\\roact\\default.project.json"],"children":[{"name":"Binding","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Binding.lua"]},{"name":"Binding.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Binding.spec.lua"]},{"name":"Component","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.lua"]},{"name":"Component.spec","className":"Folder","children":[{"name":"context.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\context.spec.lua"]},{"name":"defaultProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\defaultProps.spec.lua"]},{"name":"didMount.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\didMount.spec.lua"]},{"name":"didUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\didUpdate.spec.lua"]},{"name":"extend.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\extend.spec.lua"]},{"name":"getDerivedStateFromProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\getDerivedStateFromProps.spec.lua"]},{"name":"getElementTraceback.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\getElementTraceback.spec.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\init.spec.lua"]},{"name":"legacyContext.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\legacyContext.spec.lua"]},{"name":"render.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\render.spec.lua"]},{"name":"setState.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\setState.spec.lua"]},{"name":"shouldUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\shouldUpdate.spec.lua"]},{"name":"validateProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\validateProps.spec.lua"]},{"name":"willUnmount.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\willUnmount.spec.lua"]},{"name":"willUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\willUpdate.spec.lua"]}]},{"name":"ComponentLifecyclePhase","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ComponentLifecyclePhase.lua"]},{"name":"Config","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Config.lua"]},{"name":"Config.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Config.spec.lua"]},{"name":"ElementKind","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementKind.lua"]},{"name":"ElementKind.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementKind.spec.lua"]},{"name":"ElementUtils","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementUtils.lua"]},{"name":"ElementUtils.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementUtils.spec.lua"]},{"name":"GlobalConfig","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\GlobalConfig.lua"]},{"name":"GlobalConfig.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\GlobalConfig.spec.lua"]},{"name":"Logging","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Logging.lua"]},{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\None.lua"]},{"name":"NoopRenderer","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\NoopRenderer.lua"]},{"name":"Portal","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Portal.lua"]},{"name":"PropMarkers","className":"Folder","children":[{"name":"Change","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Change.lua"]},{"name":"Change.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Change.spec.lua"]},{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Children.lua"]},{"name":"Event","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Event.lua"]},{"name":"Event.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Event.spec.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Ref.lua"]}]},{"name":"PureComponent","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PureComponent.lua"]},{"name":"PureComponent.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PureComponent.spec.lua"]},{"name":"RobloxRenderer","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\RobloxRenderer.lua"]},{"name":"RobloxRenderer.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\RobloxRenderer.spec.lua"]},{"name":"SingleEventManager","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\SingleEventManager.lua"]},{"name":"SingleEventManager.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\SingleEventManager.spec.lua"]},{"name":"Symbol","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Symbol.lua"]},{"name":"Symbol.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Symbol.spec.lua"]},{"name":"Type","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Type.lua"]},{"name":"Type.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Type.spec.lua"]},{"name":"assertDeepEqual","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assertDeepEqual.lua"]},{"name":"assertDeepEqual.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assertDeepEqual.spec.lua"]},{"name":"assign","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assign.lua"]},{"name":"assign.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assign.spec.lua"]},{"name":"createContext","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createContext.lua"]},{"name":"createContext.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createContext.spec.lua"]},{"name":"createElement","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createElement.lua"]},{"name":"createElement.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createElement.spec.lua"]},{"name":"createFragment","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createFragment.lua"]},{"name":"createFragment.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createFragment.spec.lua"]},{"name":"createReconciler","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconciler.lua"]},{"name":"createReconciler.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconciler.spec.lua"]},{"name":"createReconcilerCompat","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconcilerCompat.lua"]},{"name":"createReconcilerCompat.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconcilerCompat.spec.lua"]},{"name":"createRef","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createRef.lua"]},{"name":"createRef.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createRef.spec.lua"]},{"name":"createSignal","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSignal.lua"]},{"name":"createSignal.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSignal.spec.lua"]},{"name":"createSpy","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSpy.lua"]},{"name":"createSpy.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSpy.spec.lua"]},{"name":"forwardRef","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\forwardRef.lua"]},{"name":"forwardRef.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\forwardRef.spec.lua"]},{"name":"getDefaultInstanceProperty","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\getDefaultInstanceProperty.lua"]},{"name":"getDefaultInstanceProperty.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\getDefaultInstanceProperty.spec.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\init.spec.lua"]},{"name":"internalAssert","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\internalAssert.lua"]},{"name":"invalidSetStateMessages","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\invalidSetStateMessages.lua"]},{"name":"oneChild","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\oneChild.lua"]},{"name":"oneChild.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\oneChild.spec.lua"]},{"name":"strict","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\strict.lua"]},{"name":"strict.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\strict.spec.lua"]}]}]}]},{"name":"synthetic","className":"ModuleScript","filePaths":["src\\init.luau"],"children":[{"name":"Component","className":"Folder","children":[{"name":"Button","className":"Folder","children":[{"name":"Badge","className":"ModuleScript","filePaths":["src\\Component\\Button\\Badge\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\Badge\\cfusion.story.luau"]}]},{"name":"Base","className":"ModuleScript","filePaths":["src\\Component\\Button\\Base.luau"]},{"name":"ElevatedButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\ElevatedButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\ElevatedButton\\cfusion.story.luau"]}]},{"name":"ExtendedFAB","className":"ModuleScript","filePaths":["src\\Component\\Button\\ExtendedFAB\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\ExtendedFAB\\cfusion.story.luau"]}]},{"name":"FAB","className":"ModuleScript","filePaths":["src\\Component\\Button\\FAB\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\FAB\\cfusion.story.luau"]}]},{"name":"FilledButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledButton\\cfusion.story.luau"]}]},{"name":"FilledIconButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledIconButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledIconButton\\cfusion.story.luau"]}]},{"name":"IconButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\IconButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\IconButton\\cfusion.story.luau"]}]},{"name":"OutlinedButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedButton\\cfusion.story.luau"]}]},{"name":"OutlinedIconButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedIconButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedIconButton\\cfusion.story.luau"]}]},{"name":"Segmented","className":"ModuleScript","filePaths":["src\\Component\\Button\\Segmented\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\Segmented\\cfusion.story.luau"]}]},{"name":"TextButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\TextButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\TextButton\\cfusion.story.luau"]}]}]}]},{"name":"Config","className":"ModuleScript","filePaths":["src\\Config.luau"]},{"name":"Enums","className":"ModuleScript","filePaths":["src\\Enums.luau"]},{"name":"Sounds","className":"ModuleScript","filePaths":["src\\Sounds.luau"]},{"name":"Test","className":"Folder","children":[{"name":"Source.cfusion","className":"ModuleScript","filePaths":["src\\Test\\Source.cfusion.luau"]}]},{"name":"Types","className":"ModuleScript","filePaths":["src\\Types.luau"]},{"name":"Util","className":"ModuleScript","filePaths":["src\\Util.luau"]}]}]}]}]} \ No newline at end of file +{"name":"synthetic-test","className":"DataModel","filePaths":["dev.project.json"],"children":[{"name":"ReplicatedStorage","className":"ReplicatedStorage","children":[{"name":"Packages","className":"Folder","children":[{"name":"ColdFusion","className":"ModuleScript","filePaths":["Packages\\ColdFusion.lua"]},{"name":"CurveUtil","className":"ModuleScript","filePaths":["Packages\\CurveUtil.lua"]},{"name":"Format","className":"ModuleScript","filePaths":["Packages\\Format.lua"]},{"name":"Fusion","className":"ModuleScript","filePaths":["Packages\\Fusion.lua"]},{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\Maid.lua"]},{"name":"MaterialIcons","className":"ModuleScript","filePaths":["Packages\\MaterialIcons.lua"]},{"name":"MeshUtil","className":"ModuleScript","filePaths":["Packages\\MeshUtil.lua"]},{"name":"Roact","className":"ModuleScript","filePaths":["Packages\\Roact.lua"]},{"name":"Signal","className":"ModuleScript","filePaths":["Packages\\Signal.lua"]},{"name":"TableUtil","className":"ModuleScript","filePaths":["Packages\\TableUtil.lua"]},{"name":"_Index","className":"Folder","children":[{"name":"elttob_fusion@0.2.0","className":"Folder","children":[{"name":"fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\init.lua","Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\default.project.json"],"children":[{"name":"Animation","className":"Folder","children":[{"name":"Spring","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\Spring.lua"]},{"name":"SpringScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\SpringScheduler.lua"]},{"name":"Tween","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\Tween.lua"]},{"name":"TweenScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\TweenScheduler.lua"]},{"name":"getTweenRatio","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\getTweenRatio.lua"]},{"name":"lerpType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\lerpType.lua"]},{"name":"packType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\packType.lua"]},{"name":"springCoefficients","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\springCoefficients.lua"]},{"name":"unpackType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\unpackType.lua"]}]},{"name":"Colour","className":"Folder","children":[{"name":"Oklab","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Colour\\Oklab.lua"]}]},{"name":"Dependencies","className":"Folder","children":[{"name":"captureDependencies","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\captureDependencies.lua"]},{"name":"initDependency","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\initDependency.lua"]},{"name":"sharedState","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\sharedState.lua"]},{"name":"updateAll","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\updateAll.lua"]},{"name":"useDependency","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\useDependency.lua"]}]},{"name":"Instances","className":"Folder","children":[{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Children.lua"]},{"name":"Cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Cleanup.lua"]},{"name":"Hydrate","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Hydrate.lua"]},{"name":"New","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\New.lua"]},{"name":"OnChange","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\OnChange.lua"]},{"name":"OnEvent","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\OnEvent.lua"]},{"name":"Out","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Out.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Ref.lua"]},{"name":"applyInstanceProps","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\applyInstanceProps.lua"]},{"name":"defaultProps","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\defaultProps.lua"]}]},{"name":"Logging","className":"Folder","children":[{"name":"logError","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logError.lua"]},{"name":"logErrorNonFatal","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logErrorNonFatal.lua"]},{"name":"logWarn","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logWarn.lua"]},{"name":"messages","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\messages.lua"]},{"name":"parseError","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\parseError.lua"]}]},{"name":"PubTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\PubTypes.lua"]},{"name":"State","className":"Folder","children":[{"name":"Computed","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Computed.lua"]},{"name":"ForKeys","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForKeys.lua"]},{"name":"ForPairs","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForPairs.lua"]},{"name":"ForValues","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForValues.lua"]},{"name":"Observer","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Observer.lua"]},{"name":"Value","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Value.lua"]},{"name":"unwrap","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\unwrap.lua"]}]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Types.lua"]},{"name":"Utility","className":"Folder","children":[{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\None.lua"]},{"name":"cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\cleanup.lua"]},{"name":"doNothing","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\doNothing.lua"]},{"name":"isSimilar","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\isSimilar.lua"]},{"name":"needsDestruction","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\needsDestruction.lua"]},{"name":"restrictRead","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\restrictRead.lua"]},{"name":"xtypeof","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\xtypeof.lua"]}]}]}]},{"name":"nightcycle_cold-fusion@9.0.7","className":"Folder","children":[{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\Maid.lua"]},{"name":"ServiceProxy","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\ServiceProxy.lua"]},{"name":"Signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\Signal.lua"]},{"name":"TableUtil","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\TableUtil.lua"]},{"name":"cold-fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\init.luau","Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\default.project.json"],"children":[{"name":"Fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\init.lua"],"children":[{"name":"Animation","className":"Folder","children":[{"name":"Spring","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\Spring.lua"]},{"name":"SpringScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\SpringScheduler.lua"]},{"name":"Tween","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\Tween.lua"]},{"name":"TweenScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\TweenScheduler.lua"]},{"name":"getTweenRatio","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\getTweenRatio.lua"]},{"name":"lerpType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\lerpType.lua"]},{"name":"packType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\packType.lua"]},{"name":"springCoefficients","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\springCoefficients.lua"]},{"name":"unpackType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\unpackType.lua"]}]},{"name":"Colour","className":"Folder","children":[{"name":"Oklab","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Colour\\Oklab.lua"]}]},{"name":"Instances","className":"Folder","children":[{"name":"Attribute","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Attribute.lua"]},{"name":"AttributeChange","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\AttributeChange.lua"]},{"name":"AttributeOut","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\AttributeOut.lua"]},{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Children.lua"]},{"name":"Cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Cleanup.lua"]},{"name":"Hydrate","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Hydrate.lua"]},{"name":"New","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\New.lua"]},{"name":"OnChange","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\OnChange.lua"]},{"name":"OnEvent","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\OnEvent.lua"]},{"name":"Out","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Out.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Ref.lua"]},{"name":"applyInstanceProps","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\applyInstanceProps.lua"]},{"name":"defaultProps","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\defaultProps.lua"]}]},{"name":"Logging","className":"Folder","children":[{"name":"logError","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logError.lua"]},{"name":"logErrorNonFatal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logErrorNonFatal.lua"]},{"name":"logWarn","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logWarn.lua"]},{"name":"messages","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\messages.lua"]},{"name":"parseError","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\parseError.lua"]}]},{"name":"PubTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\PubTypes.lua"]},{"name":"State","className":"Folder","children":[{"name":"Computed","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Computed.lua"]},{"name":"ForKeys","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForKeys.lua"]},{"name":"ForPairs","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForPairs.lua"]},{"name":"ForValues","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForValues.lua"]},{"name":"Observer","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Observer.lua"]},{"name":"Value","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Value.lua"]},{"name":"isState","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\isState.lua"]},{"name":"makeUseCallback","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\makeUseCallback.lua"]},{"name":"peek","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\peek.lua"]},{"name":"updateAll","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\updateAll.lua"]}]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Types.lua"]},{"name":"Utility","className":"Folder","children":[{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\None.lua"]},{"name":"cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\cleanup.lua"]},{"name":"doNothing","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\doNothing.lua"]},{"name":"isSimilar","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\isSimilar.lua"]},{"name":"needsDestruction","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\needsDestruction.lua"]},{"name":"restrictRead","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\restrictRead.lua"]},{"name":"xtypeof","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\xtypeof.lua"]}]}]},{"name":"InstanceTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\InstanceTypes.luau"]},{"name":"Interface","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Interface.luau"]},{"name":"Test.story","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Test.story.luau"]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Types.luau"]},{"name":"Util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Util.luau"]}]}]},{"name":"nightcycle_curve-util@1.0.0","className":"Folder","children":[{"name":"Vector","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\Vector.lua"]},{"name":"curve-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\init.lua","Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\default.project.json"],"children":[{"name":"Ease","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\Ease.lua"]},{"name":"Lerp","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\Lerp.lua"]}]}]},{"name":"nightcycle_format@0.1.3","className":"Folder","children":[{"name":"format","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\init.lua","Packages\\_Index\\nightcycle_format@0.1.3\\format\\default.project.json"],"children":[{"name":"Emoji","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\Emoji.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\init.spec.lua"]}]},{"name":"maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\maid.lua"]},{"name":"signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\signal.lua"]},{"name":"string","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\string.lua"]}]},{"name":"nightcycle_geometry-util@1.1.1","className":"Folder","children":[{"name":"geometry-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\init.lua","Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\default.project.json"],"children":[{"name":"Earcut","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\Earcut\\init.lua"],"children":[{"name":"ZeroArray","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\Earcut\\ZeroArray.lua"]}]}]}]},{"name":"nightcycle_maid@1.1.4","className":"Folder","children":[{"name":"maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\init.lua","Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\default.project.json"],"children":[{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\Maid.lua"]},{"name":"MaidTaskUtils","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\MaidTaskUtils.lua"]}]}]},{"name":"nightcycle_material-icons@1.0.1","className":"Folder","children":[{"name":"material-icons","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\init.luau","Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\default.project.json"],"children":[{"name":"Default_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_1.luau"]},{"name":"Default_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_2.luau"]},{"name":"Default_18_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_3.luau"]},{"name":"Default_18_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_4.luau"]},{"name":"Default_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_1.luau"]},{"name":"Default_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_2.luau"]},{"name":"Default_24_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_3.luau"]},{"name":"Default_24_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_4.luau"]},{"name":"Default_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_1.luau"]},{"name":"Default_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_2.luau"]},{"name":"Default_36_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_3.luau"]},{"name":"Default_36_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_4.luau"]},{"name":"Default_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_1.luau"]},{"name":"Default_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_2.luau"]},{"name":"Default_48_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_3.luau"]},{"name":"Default_48_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_4.luau"]},{"name":"Outlined_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_18_1.luau"]},{"name":"Outlined_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_18_2.luau"]},{"name":"Outlined_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_24_1.luau"]},{"name":"Outlined_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_24_2.luau"]},{"name":"Outlined_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_36_1.luau"]},{"name":"Outlined_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_36_2.luau"]},{"name":"Outlined_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_48_1.luau"]},{"name":"Outlined_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_48_2.luau"]},{"name":"Round_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_18_1.luau"]},{"name":"Round_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_18_2.luau"]},{"name":"Round_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_24_1.luau"]},{"name":"Round_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_24_2.luau"]},{"name":"Round_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_36_1.luau"]},{"name":"Round_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_36_2.luau"]},{"name":"Round_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_48_1.luau"]},{"name":"Round_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_48_2.luau"]},{"name":"Sharp_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_18_1.luau"]},{"name":"Sharp_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_18_2.luau"]},{"name":"Sharp_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_24_1.luau"]},{"name":"Sharp_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_24_2.luau"]},{"name":"Sharp_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_36_1.luau"]},{"name":"Sharp_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_36_2.luau"]},{"name":"Sharp_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_48_1.luau"]},{"name":"Sharp_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_48_2.luau"]},{"name":"TwoTone_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_18_1.luau"]},{"name":"TwoTone_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_18_2.luau"]},{"name":"TwoTone_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_24_1.luau"]},{"name":"TwoTone_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_24_2.luau"]},{"name":"TwoTone_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_36_1.luau"]},{"name":"TwoTone_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_36_2.luau"]},{"name":"TwoTone_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_48_1.luau"]},{"name":"TwoTone_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_48_2.luau"]}]}]},{"name":"nightcycle_mesh-util@1.0.3","className":"Folder","children":[{"name":"GeometryUtil","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\GeometryUtil.lua"]},{"name":"mesh-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\init.lua","Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\default.project.json"],"children":[{"name":"CornerWedgePart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\CornerWedgePart.lua"]},{"name":"Part","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\Part.lua"]},{"name":"TetraPart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\TetraPart.lua"]},{"name":"WedgePart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\WedgePart.lua"]}]}]},{"name":"nightcycle_service-proxy@1.0.0","className":"Folder","children":[{"name":"service-proxy","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_service-proxy@1.0.0\\service-proxy\\src\\init.lua","Packages\\_Index\\nightcycle_service-proxy@1.0.0\\service-proxy\\default.project.json"]}]},{"name":"nightcycle_signal@1.0.2","className":"Folder","children":[{"name":"signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_signal@1.0.2\\signal\\src\\init.lua","Packages\\_Index\\nightcycle_signal@1.0.2\\signal\\default.project.json"]}]},{"name":"nightcycle_string@0.1.0","className":"Folder","children":[{"name":"string","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_string@0.1.0\\string\\src\\init.lua","Packages\\_Index\\nightcycle_string@0.1.0\\string\\default.project.json"],"children":[{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_string@0.1.0\\string\\src\\init.spec.lua"]}]}]},{"name":"nightcycle_table-util@1.1.0","className":"Folder","children":[{"name":"table-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_table-util@1.1.0\\table-util\\src\\init.lua","Packages\\_Index\\nightcycle_table-util@1.1.0\\table-util\\default.project.json"]}]},{"name":"nightcycle_vector@1.0.2","className":"Folder","children":[{"name":"vector","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_vector@1.0.2\\vector\\src\\init.lua","Packages\\_Index\\nightcycle_vector@1.0.2\\vector\\default.project.json"]}]},{"name":"roblox_roact@1.4.4","className":"Folder","children":[{"name":"roact","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\init.lua","Packages\\_Index\\roblox_roact@1.4.4\\roact\\default.project.json"],"children":[{"name":"Binding","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Binding.lua"]},{"name":"Binding.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Binding.spec.lua"]},{"name":"Component","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.lua"]},{"name":"Component.spec","className":"Folder","children":[{"name":"context.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\context.spec.lua"]},{"name":"defaultProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\defaultProps.spec.lua"]},{"name":"didMount.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\didMount.spec.lua"]},{"name":"didUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\didUpdate.spec.lua"]},{"name":"extend.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\extend.spec.lua"]},{"name":"getDerivedStateFromProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\getDerivedStateFromProps.spec.lua"]},{"name":"getElementTraceback.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\getElementTraceback.spec.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\init.spec.lua"]},{"name":"legacyContext.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\legacyContext.spec.lua"]},{"name":"render.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\render.spec.lua"]},{"name":"setState.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\setState.spec.lua"]},{"name":"shouldUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\shouldUpdate.spec.lua"]},{"name":"validateProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\validateProps.spec.lua"]},{"name":"willUnmount.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\willUnmount.spec.lua"]},{"name":"willUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\willUpdate.spec.lua"]}]},{"name":"ComponentLifecyclePhase","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ComponentLifecyclePhase.lua"]},{"name":"Config","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Config.lua"]},{"name":"Config.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Config.spec.lua"]},{"name":"ElementKind","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementKind.lua"]},{"name":"ElementKind.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementKind.spec.lua"]},{"name":"ElementUtils","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementUtils.lua"]},{"name":"ElementUtils.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementUtils.spec.lua"]},{"name":"GlobalConfig","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\GlobalConfig.lua"]},{"name":"GlobalConfig.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\GlobalConfig.spec.lua"]},{"name":"Logging","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Logging.lua"]},{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\None.lua"]},{"name":"NoopRenderer","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\NoopRenderer.lua"]},{"name":"Portal","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Portal.lua"]},{"name":"PropMarkers","className":"Folder","children":[{"name":"Change","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Change.lua"]},{"name":"Change.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Change.spec.lua"]},{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Children.lua"]},{"name":"Event","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Event.lua"]},{"name":"Event.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Event.spec.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Ref.lua"]}]},{"name":"PureComponent","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PureComponent.lua"]},{"name":"PureComponent.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PureComponent.spec.lua"]},{"name":"RobloxRenderer","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\RobloxRenderer.lua"]},{"name":"RobloxRenderer.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\RobloxRenderer.spec.lua"]},{"name":"SingleEventManager","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\SingleEventManager.lua"]},{"name":"SingleEventManager.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\SingleEventManager.spec.lua"]},{"name":"Symbol","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Symbol.lua"]},{"name":"Symbol.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Symbol.spec.lua"]},{"name":"Type","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Type.lua"]},{"name":"Type.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Type.spec.lua"]},{"name":"assertDeepEqual","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assertDeepEqual.lua"]},{"name":"assertDeepEqual.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assertDeepEqual.spec.lua"]},{"name":"assign","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assign.lua"]},{"name":"assign.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assign.spec.lua"]},{"name":"createContext","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createContext.lua"]},{"name":"createContext.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createContext.spec.lua"]},{"name":"createElement","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createElement.lua"]},{"name":"createElement.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createElement.spec.lua"]},{"name":"createFragment","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createFragment.lua"]},{"name":"createFragment.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createFragment.spec.lua"]},{"name":"createReconciler","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconciler.lua"]},{"name":"createReconciler.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconciler.spec.lua"]},{"name":"createReconcilerCompat","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconcilerCompat.lua"]},{"name":"createReconcilerCompat.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconcilerCompat.spec.lua"]},{"name":"createRef","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createRef.lua"]},{"name":"createRef.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createRef.spec.lua"]},{"name":"createSignal","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSignal.lua"]},{"name":"createSignal.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSignal.spec.lua"]},{"name":"createSpy","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSpy.lua"]},{"name":"createSpy.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSpy.spec.lua"]},{"name":"forwardRef","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\forwardRef.lua"]},{"name":"forwardRef.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\forwardRef.spec.lua"]},{"name":"getDefaultInstanceProperty","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\getDefaultInstanceProperty.lua"]},{"name":"getDefaultInstanceProperty.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\getDefaultInstanceProperty.spec.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\init.spec.lua"]},{"name":"internalAssert","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\internalAssert.lua"]},{"name":"invalidSetStateMessages","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\invalidSetStateMessages.lua"]},{"name":"oneChild","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\oneChild.lua"]},{"name":"oneChild.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\oneChild.spec.lua"]},{"name":"strict","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\strict.lua"]},{"name":"strict.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\strict.spec.lua"]}]}]}]},{"name":"synthetic","className":"ModuleScript","filePaths":["src\\init.luau"],"children":[{"name":"Component","className":"Folder","children":[{"name":"Bar","className":"Folder","children":[{"name":"Bottom","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Bottom\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Bottom\\cfusion.story.luau"]}]}]},{"name":"Button","className":"Folder","children":[{"name":"Badge","className":"ModuleScript","filePaths":["src\\Component\\Button\\Badge\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\Badge\\cfusion.story.luau"]}]},{"name":"Base","className":"ModuleScript","filePaths":["src\\Component\\Button\\Base.luau"]},{"name":"ElevatedButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\ElevatedButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\ElevatedButton\\cfusion.story.luau"]}]},{"name":"ExtendedFAB","className":"ModuleScript","filePaths":["src\\Component\\Button\\ExtendedFAB\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\ExtendedFAB\\cfusion.story.luau"]}]},{"name":"FAB","className":"ModuleScript","filePaths":["src\\Component\\Button\\FAB\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\FAB\\cfusion.story.luau"]}]},{"name":"FilledButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledButton\\cfusion.story.luau"]}]},{"name":"FilledIconButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledIconButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledIconButton\\cfusion.story.luau"]}]},{"name":"IconButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\IconButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\IconButton\\cfusion.story.luau"]}]},{"name":"OutlinedButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedButton\\cfusion.story.luau"]}]},{"name":"OutlinedIconButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedIconButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedIconButton\\cfusion.story.luau"]}]},{"name":"Segmented","className":"ModuleScript","filePaths":["src\\Component\\Button\\Segmented\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\Segmented\\cfusion.story.luau"]}]},{"name":"TextButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\TextButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\TextButton\\cfusion.story.luau"]}]}]}]},{"name":"Config","className":"ModuleScript","filePaths":["src\\Config.luau"]},{"name":"Enums","className":"ModuleScript","filePaths":["src\\Enums.luau"]},{"name":"Sounds","className":"ModuleScript","filePaths":["src\\Sounds.luau"]},{"name":"Test","className":"Folder","children":[{"name":"Source.cfusion","className":"ModuleScript","filePaths":["src\\Test\\Source.cfusion.luau"]}]},{"name":"Types","className":"ModuleScript","filePaths":["src\\Types.luau"]},{"name":"Util","className":"ModuleScript","filePaths":["src\\Util.luau"]}]}]}]}]} \ No newline at end of file diff --git a/src/Component/Bar/Bottom/cfusion.story.luau b/src/Component/Bar/Bottom/cfusion.story.luau new file mode 100644 index 00000000..0dac0249 --- /dev/null +++ b/src/Component/Bar/Bottom/cfusion.story.luau @@ -0,0 +1,86 @@ +--!strict +local _Package = script.Parent.Parent.Parent.Parent +local _Packages = _Package.Parent +-- Services +-- Packages +local Maid = require(_Packages:WaitForChild("Maid")) +local MaterialIcons = require(_Packages:WaitForChild("MaterialIcons")) + +-- Modules +local Types = require(_Package:WaitForChild("Types")) + +-- Types +-- Constants +local SCALE = 1 +-- Variables +-- References +local Icons = MaterialIcons.default.dp_48.scale_1 + +-- Class +return function(frame: Frame) + local maid = Maid.new() + task.spawn(function() + local Module = require(script.Parent) + + local listLayout = maid:GiveTask(Instance.new("UIListLayout")) + listLayout.FillDirection = Enum.FillDirection.Vertical + listLayout.Padding = UDim.new(0, 10) + listLayout.VerticalAlignment = Enum.VerticalAlignment.Center + listLayout.HorizontalAlignment = Enum.HorizontalAlignment.Center + listLayout.Parent = frame + + local function build(isDarkMode: boolean, color: Color3) + local selectionColor = nil --Color3.new(1,0.75,0) + -- local frameColor = Color3.new(0, 0, 0) + + local theme = Types.newThemeData( + 0, + isDarkMode, + SCALE, + Font.fromEnum(Enum.Font.SourceSans), + color, + nil, --frameColor, + selectionColor + ) + + local out = maid:GiveTask(Module.cfusion( + { + Types.newButtonData( + function() + print("save click") + end, + Icons.save + ), + Types.newButtonData( + function() + print("publish click") + end, + Icons.publish + ), + }, + Types.newButtonData( + function() + print("FAB click") + end, + Icons.plus_one + ), + theme + )) + + out.Position = UDim2.fromScale(0.5, 0.5) + out.AnchorPoint = Vector2.new(0.5, 0.5) + out.Size= UDim2.fromScale(1,0) + out.Parent = frame + + end + build(false, Color3.fromHSV(0.5, 0.3, 0.95)) + build(true, Color3.fromHSV(0.5, 0.5, 0.4)) + build(false, Color3.fromHSV(0.1, 0.3, 0.95)) + build(true, Color3.fromHSV(0.1, 0.5, 0.4)) + build(false, Color3.fromHSV(0.7, 0.3, 0.95)) + build(true, Color3.fromHSV(0.7, 0.5, 0.4)) + end) + return function() + maid:Destroy() + end +end diff --git a/src/Component/Bar/Bottom/init.luau b/src/Component/Bar/Bottom/init.luau new file mode 100644 index 00000000..e3ac6c82 --- /dev/null +++ b/src/Component/Bar/Bottom/init.luau @@ -0,0 +1,210 @@ +--!strict +local _Package = script.Parent.Parent.Parent +local _Packages = _Package.Parent +-- Services +local SoundService = game:GetService("SoundService") + +-- Packages +local Maid = require(_Packages:WaitForChild("Maid")) +local ColdFusion = require(_Packages:WaitForChild("ColdFusion")) +local Signal = require(_Packages:WaitForChild("Signal")) +local MaterialIcons = require(_Packages:WaitForChild("MaterialIcons")) +local TableUtil = require(_Packages:WaitForChild("TableUtil")) + +-- Modules +local Sounds = require(_Package:WaitForChild("Sounds")) +local Enums = require(_Package:WaitForChild("Enums")) +local Types = require(_Package:WaitForChild("Types")) +local Config = require(_Package:WaitForChild("Config")) +local Util = require(_Package:WaitForChild("Util")) + +local IconButton = require(_Package:WaitForChild("Component"):WaitForChild("Button"):WaitForChild("IconButton")) +local FAB = require(_Package:WaitForChild("Component"):WaitForChild("Button"):WaitForChild("FAB")) + +-- Types +type Maid = Maid.Maid +type State = ColdFusion.State +type ValueState = ColdFusion.ValueState +type CanBeState = ColdFusion.CanBeState +type TextStyle = Types.TextStyle +type ToggleTextStyle = Types.ToggleTextStyle +type ImageData = Types.ImageData +type ThemeData = Types.ThemeData +type OptionData = Types.OptionData +type Signal = Signal.Signal +type ButtonData = Types.ButtonData +-- Constants +local MAX_BUTTONS = 4 +local ICONS = MaterialIcons.default.dp_48.scale_1 +local ERROR_ICON = ICONS.error +local BUTTON_SEPARATION_DP = 4 +local BAR_TOP_BOTTOM_PADDING_DP = 6 +local BAR_LEFT_RIGHT_PADDING_DP = 10 +-- Variables +-- References +-- Private Functions + +-- Class +local Interface = {} + +function Interface.cfusion( + buttons: CanBeState<{ + [number]: ButtonData + }>, + fab: CanBeState, + theme: CanBeState +): Frame + local maid = Maid.new() + + local _fuse = ColdFusion.fuse(maid) + + local _new = _fuse.new + local _bind = _fuse.bind + local _clone = _fuse.clone + local _import = _fuse.import + + local _Value = _fuse.Value + local _Computed = _fuse.Computed + + local buttonsState: State<{ + [number]: ButtonData + }> = _import(buttons, {}) + + local themeState: State = _import(theme, nil :: ThemeData?) + local elevatedThemeState = _Computed(function(th: ThemeData): ThemeData + local cth: ThemeData = TableUtil.deepCopy(th) + cth.Elevation += 1 + return cth + end, themeState) + local contrastThemeState = _Computed(function(th: ThemeData): ThemeData + local cth: ThemeData = TableUtil.deepCopy(th) + cth.Color3 = Util.getReadableColor(cth.Color3, Util.getElevatedColor(cth.BackgroundColor3 or cth.Color3, cth.Elevation, cth.IsDarkMode)) + return cth + end, elevatedThemeState) + local scaleState: State = _Computed(function(th: ThemeData): number + return th.Scale + end, themeState) + local fabState: State = _import(fab, nil :: ButtonData?) + + local inst = _new("Frame")({ + AutomaticSize = Enum.AutomaticSize.XY, + BackgroundColor3 = _Computed(function(th: ThemeData): Color3 + return Util.getElevatedColor(th.BackgroundColor3 or th.Color3, th.Elevation, th.IsDarkMode) + end, themeState), + Children = { + _new("UIListLayout")({ + Padding = _Computed(function(s: number): UDim + return UDim.new(0, 0) + end, scaleState), + HorizontalFlex = Enum.UIFlexAlignment.Fill, + SortOrder = Enum.SortOrder.LayoutOrder, + FillDirection = Enum.FillDirection.Horizontal, + ItemLineAlignment = Enum.ItemLineAlignment.Center, + VerticalAlignment = Enum.VerticalAlignment.Center, + HorizontalAlignment = Enum.HorizontalAlignment.Center, + }), + _new("UIPadding")({ + PaddingLeft = _Computed(function(s: number): UDim + return UDim.new(0, BAR_LEFT_RIGHT_PADDING_DP * s) + end, scaleState), + PaddingRight = _Computed(function(s: number): UDim + return UDim.new(0, BAR_LEFT_RIGHT_PADDING_DP * s) + end, scaleState), + PaddingTop = _Computed(function(s: number): UDim + return UDim.new(0, BAR_TOP_BOTTOM_PADDING_DP * s) + end, scaleState), + PaddingBottom = _Computed(function(s: number): UDim + return UDim.new(0, BAR_TOP_BOTTOM_PADDING_DP * s) + end, scaleState), + }), + } + }) :: Frame + + + _new("Frame")({ + AutomaticSize = Enum.AutomaticSize.XY, + Parent = inst, + LayoutOrder = 2, + BackgroundTransparency = 1, + Children = { + _new("UIListLayout")({ + Padding = _Computed(function(s: number): UDim + return UDim.new(0, s * BUTTON_SEPARATION_DP) + end, scaleState), + SortOrder = Enum.SortOrder.LayoutOrder, + FillDirection = Enum.FillDirection.Horizontal, + ItemLineAlignment = Enum.ItemLineAlignment.Center, + VerticalAlignment = Enum.VerticalAlignment.Center, + HorizontalAlignment = Enum.HorizontalAlignment.Right, + }), + _bind(FAB.cfusion( + _Computed(function(fData: ButtonData?) + return if fData then fData.OnClick else function() end + end, fabState), + _Computed(function(fData: ButtonData?): ImageData + return if fData and fData.Icon then fData.Icon else ERROR_ICON + end, fabState), + elevatedThemeState, + _Computed(function(fData: ButtonData?): boolean + return if fData then fData.Enabled else true + end, fabState) + ))({ + Visible = _Computed(function(fData: ButtonData?): boolean + return fData ~= nil + end, fabState), + Parent = inst, + }) + } + }) + + + local buttonContainer = _new("Frame")({ + AutomaticSize = Enum.AutomaticSize.XY, + Parent = inst, + LayoutOrder = 1, + BackgroundTransparency = 1, + Children = { + _new("UIListLayout")({ + Padding = _Computed(function(s: number): UDim + return UDim.new(0, s * BUTTON_SEPARATION_DP) + end, scaleState), + SortOrder = Enum.SortOrder.LayoutOrder, + FillDirection = Enum.FillDirection.Horizontal, + ItemLineAlignment = Enum.ItemLineAlignment.Center, + VerticalAlignment = Enum.VerticalAlignment.Center, + HorizontalAlignment = Enum.HorizontalAlignment.Left, + }), + } + }) :: Frame + + for i=1, MAX_BUTTONS do + local buttonData = _Computed(function(bs: {[number]: ButtonData}): ButtonData? + return bs[i] + end, buttonsState) + + _bind(IconButton.cfusion( + _Computed(function(bData: ButtonData?) + return if bData then bData.OnClick else function() end + end, buttonData), + _Computed(function(bData: ButtonData?): ImageData + return if bData and bData.Icon then bData.Icon else ERROR_ICON + end, buttonData), + contrastThemeState, + _Computed(function(bData: ButtonData?): boolean + return if bData then bData.Enabled else true + end, buttonData) + ))({ + LayoutOrder = i, + Visible = _Computed(function(bData: ButtonData?): boolean + return bData ~= nil + end, buttonData), + Parent = buttonContainer, + }) + + end + + return inst + +end + +return Interface diff --git a/src/Component/Button/Base.luau b/src/Component/Button/Base.luau index 40a1bd2f..4c551f1f 100644 --- a/src/Component/Button/Base.luau +++ b/src/Component/Button/Base.luau @@ -50,7 +50,7 @@ return function( cornerRadius: CanBeState?, paddingScale: CanBeState?, useRipple: CanBeState? -): ImageLabel +): Frame local _fuse = ColdFusion.fuse(maid) local _new = _fuse.new @@ -118,7 +118,7 @@ return function( local paddingScaleState = _import(paddingScale, 1) local useRippleState = _import(useRipple, false) - local inst: ImageLabel + local inst: Frame local rippleColorState: ValueState = _Value(nil :: ColorSequence?) @@ -172,241 +172,253 @@ return function( maid._ripple = runMaid end - inst = _new("ImageLabel")({ - Image = "rbxassetid://15549395120", - ImageColor3 = Color3.new(0, 0, 0), + local shadowSizeState = _Computed(function(s: number, isDrop: boolean): UDim + return if isDrop then UDim.new(0, s * 5) else UDim.new(0, 0) + end, scaleState, isDropShadowState) + + inst = _new("Frame")({ BackgroundTransparency = 1, - ImageTransparency = _Computed(function(style: TextStyle, isDrop: boolean): number - return if style.BackgroundTransparency == 0 and isDrop then 0 else 1 - end, currentStyleState, isDropShadowState), - ScaleType = Enum.ScaleType.Slice, AutomaticSize = Enum.AutomaticSize.XY, - SliceCenter = Rect.new(HALF_IMAGE_SIZE, HALF_IMAGE_SIZE, HALF_IMAGE_SIZE, HALF_IMAGE_SIZE), - SliceScale = 1, Children = { - _new("UIListLayout")({ - Padding = UDim.new(0, 0), - SortOrder = Enum.SortOrder.LayoutOrder, - FillDirection = Enum.FillDirection.Horizontal, - ItemLineAlignment = Enum.ItemLineAlignment.Center, - VerticalAlignment = Enum.VerticalAlignment.Center, - HorizontalAlignment = Enum.HorizontalAlignment.Center, - }), _new("UIPadding")({ - PaddingBottom = _Computed(function(s: number, isDrop: boolean): UDim - return if isDrop then UDim.new(0, s * 5) else UDim.new(0, 0) - end, scaleState, isDropShadowState), + PaddingTop = shadowSizeState, }), - _new("TextButton")({ - Name = "TextButton", - Text = "", - BackgroundTransparency = _Computed(function(style: TextStyle): number - return style.BackgroundTransparency - end, currentStyleState), - BackgroundColor3 = _Computed(function(style: TextStyle, useRip: boolean): Color3 - if useRip then - return Color3.new(1, 1, 1) - end - return style.BackgroundColor3 - end, currentStyleState, useRippleState), - Active = isEnabledState, - AutomaticSize = Enum.AutomaticSize.X, - Size = _Computed(function(s: number): UDim2 - return UDim2.fromOffset(0, s * HEIGHT_DP) - end, scaleState), - Events = { - Activated = function() - if isEnabledState:Get() == false then - return - end - local click = onClickState:Get() - local s = soundState:Get() - if s then - SoundService:PlayLocalSound(s) - end - click() - end, - MouseButton1Down = function(x: number, y: number) - if isEnabledState:Get() == false then - return - end - isPressedState:Set(true) - end, - MouseButton1Up = function(x: number, y: number) - if isEnabledState:Get() == false then - return - end - if useRippleState:Get() then - ripple(Vector2.new(x, y)) - end - isPressedState:Set(false) - end, - MouseEnter = function() - isHoveredState:Set(true) - end, - MouseLeave = function() - isHoveredState:Set(false) - end, - SelectionGained = function() - isFocusedState:Set(true) - end, - SelectionLost = function() - isFocusedState:Set(false) - end, - }, + _new("ImageLabel")({ + Image = "rbxassetid://15549395120", + ImageColor3 = Color3.new(0, 0, 0), + BackgroundTransparency = 1, + ImageTransparency = _Computed(function(style: TextStyle, isDrop: boolean): number + return if style.BackgroundTransparency == 0 and isDrop then 0 else 1 + end, currentStyleState, isDropShadowState), + ScaleType = Enum.ScaleType.Slice, + AutomaticSize = Enum.AutomaticSize.XY, + SliceCenter = Rect.new(HALF_IMAGE_SIZE, HALF_IMAGE_SIZE, HALF_IMAGE_SIZE, HALF_IMAGE_SIZE), + SliceScale = 1, Children = { - _new("UICorner")({ - CornerRadius = _Computed(function(s: number, cornerRad: number): UDim - return UDim.new(0, s * cornerRad) - end, scaleState, cornerRadiusState), - }), - _new("UIGradient")({ - Color = _Computed( - function(useRip: boolean, style: TextStyle, seq: ColorSequence?): ColorSequence - if useRip then - if seq then - return seq - else - return ColorSequence.new(style.BackgroundColor3) - end - else - return ColorSequence.new(Color3.new(1, 1, 1)) - end - end, - useRippleState, - currentStyleState, - rippleColorState - ), - }), - _new("UIStroke")({ - ApplyStrokeMode = Enum.ApplyStrokeMode.Border, - Color = _Computed(function(style: TextStyle): Color3 - return style.BorderColor3 - end, currentStyleState), - LineJoinMode = Enum.LineJoinMode.Round, - Thickness = _Computed(function(s: number): number - return math.max(s * 1, 1) - end, scaleState), - Transparency = _Computed(function(style: TextStyle): number - return style.BorderTransparency - end, currentStyleState), - }), _new("UIListLayout")({ - Padding = _Computed(function(s: number): UDim - return UDim.new(0, s * PADDING_BETWEEN_ELEMENTS_DP) - end, scaleState), + Padding = UDim.new(0, 0), SortOrder = Enum.SortOrder.LayoutOrder, FillDirection = Enum.FillDirection.Horizontal, ItemLineAlignment = Enum.ItemLineAlignment.Center, VerticalAlignment = Enum.VerticalAlignment.Center, HorizontalAlignment = Enum.HorizontalAlignment.Center, }), - _new("TextLabel")({ - Text = textState, - Visible = _Computed(function(txt: string): boolean - return txt:len() > 0 - end, textState), - TextScaled = true, - TextXAlignment = LABEL_TEXT_ALIGNMENT, - TextYAlignment = Enum.TextYAlignment.Center, - BackgroundTransparency = 1, - AutomaticSize = Enum.AutomaticSize.X, - FontFace = fontState, - LayoutOrder = 2, - TextColor3 = _Computed(function(style: TextStyle): Color3 - return style.TextColor3 - end, currentStyleState), - TextTransparency = _Computed(function(style: TextStyle): number - return style.TextTransparency - end, currentStyleState), - Size = _Computed(function(s: number): UDim2 - return UDim2.fromOffset(0, s * ICON_SIZE_DP) - end, scaleState), + _new("UIPadding")({ + PaddingBottom = shadowSizeState, }), - _new("ImageLabel")({ - Name = "Icon", - LayoutOrder = 1, - BackgroundTransparency = 1, - Visible = _Computed(function(icon: ImageData?): boolean - return icon ~= nil - end, iconState), - Image = _Computed(function(icon: ImageData?): string - return if icon then icon.Image else "" - end, iconState), - ImageColor3 = _Computed(function(icon: ImageData?, style: TextStyle?): Color3 - return if icon and style then style.TextColor3 else Color3.new(1, 1, 1) - end, iconState, currentStyleState), - ImageRectOffset = _Computed(function(icon: ImageData?): Vector2 - return if icon then icon.ImageRectOffset else Vector2.zero - end, iconState), - ImageRectSize = _Computed(function(icon: ImageData?): Vector2 - return if icon then icon.ImageRectSize else Vector2.zero - end, iconState), - ImageTransparency = _Computed(function(icon: ImageData?, style: TextStyle?): number - return if icon and style then style.TextTransparency else 1 - end, iconState, currentStyleState), - SizeConstraint = Enum.SizeConstraint.RelativeYY, + _new("TextButton")({ + Name = "TextButton", + Text = "", + BackgroundTransparency = _Computed(function(style: TextStyle): number + return style.BackgroundTransparency + end, currentStyleState), + BackgroundColor3 = _Computed(function(style: TextStyle, useRip: boolean): Color3 + if useRip then + return Color3.new(1, 1, 1) + end + return style.BackgroundColor3 + end, currentStyleState, useRippleState), + Active = isEnabledState, + AutomaticSize = Enum.AutomaticSize.X, Size = _Computed(function(s: number): UDim2 - return UDim2.fromScale(1, 1) - -- return UDim2.fromOffset(s * ICON_SIZE_DP, s * ICON_SIZE_DP) + return UDim2.fromOffset(0, s * HEIGHT_DP) end, scaleState), - }), - _new("UIPadding")({ - PaddingLeft = _Computed( - function(s: number, icon: ImageData?, txt: string, padScale: number): UDim - if icon then - if txt:len() > 0 then - return UDim.new(0, padScale * LEFT_PADDING_WITH_ICON_DP * s) - else - return UDim.new(0, padScale * s * (HEIGHT_DP - ICON_SIZE_DP) / 2) - end - else - return UDim.new(0, padScale * LEFT_RIGHT_PADDING_DP * s) + Events = { + Activated = function() + if isEnabledState:Get() == false then + return end + local click = onClickState:Get() + local s = soundState:Get() + if s then + SoundService:PlayLocalSound(s) + end + click() end, - scaleState, - iconState, - textState, - paddingScaleState - ), - PaddingRight = _Computed( - function(s: number, icon: ImageData?, txt: string, padScale: number): UDim - if icon then - if txt:len() > 0 then - return UDim.new(0, padScale * RIGHT_PADDING_WITH_ICON_DP * s) - else - return UDim.new(0, padScale * s * (HEIGHT_DP - ICON_SIZE_DP) / 2) - end - else - return UDim.new(0, padScale * LEFT_RIGHT_PADDING_DP * s) + MouseButton1Down = function(x: number, y: number) + if isEnabledState:Get() == false then + return end + isPressedState:Set(true) end, - scaleState, - iconState, - textState, - paddingScaleState - ), - PaddingTop = _Computed(function(s: number, padScale: number): UDim - return UDim.new(0, padScale * s * (HEIGHT_DP - ICON_SIZE_DP) / 2) - end, scaleState, paddingScaleState), - PaddingBottom = _Computed(function(s: number, padScale: number): UDim - return UDim.new(0, padScale * s * (HEIGHT_DP - ICON_SIZE_DP) / 2) - end, scaleState, paddingScaleState), - }), - _new("UISizeConstraint")({ - MaxSize = Vector2.new(math.huge, math.huge), - MinSize = _Computed(function(s: number, hasMin: boolean): Vector2 - if hasMin then - return Vector2.new(s * CONTAINER_WIDTH_MIN_DP, 0) - else - return Vector2.new(0, 0) - end - end, scaleState, hasMinState), - }), + MouseButton1Up = function(x: number, y: number) + if isEnabledState:Get() == false then + return + end + if useRippleState:Get() then + ripple(Vector2.new(x, y)) + end + isPressedState:Set(false) + end, + MouseEnter = function() + isHoveredState:Set(true) + end, + MouseLeave = function() + isHoveredState:Set(false) + end, + SelectionGained = function() + isFocusedState:Set(true) + end, + SelectionLost = function() + isFocusedState:Set(false) + end, + }, + Children = { + _new("UICorner")({ + CornerRadius = _Computed(function(s: number, cornerRad: number): UDim + return UDim.new(0, s * cornerRad) + end, scaleState, cornerRadiusState), + }), + _new("UIGradient")({ + Color = _Computed( + function(useRip: boolean, style: TextStyle, seq: ColorSequence?): ColorSequence + if useRip then + if seq then + return seq + else + return ColorSequence.new(style.BackgroundColor3) + end + else + return ColorSequence.new(Color3.new(1, 1, 1)) + end + end, + useRippleState, + currentStyleState, + rippleColorState + ), + }), + _new("UIStroke")({ + ApplyStrokeMode = Enum.ApplyStrokeMode.Border, + Color = _Computed(function(style: TextStyle): Color3 + return style.BorderColor3 + end, currentStyleState), + LineJoinMode = Enum.LineJoinMode.Round, + Thickness = _Computed(function(s: number): number + return math.max(s * 1, 1) + end, scaleState), + Transparency = _Computed(function(style: TextStyle): number + return style.BorderTransparency + end, currentStyleState), + }), + _new("UIListLayout")({ + Padding = _Computed(function(s: number): UDim + return UDim.new(0, s * PADDING_BETWEEN_ELEMENTS_DP) + end, scaleState), + SortOrder = Enum.SortOrder.LayoutOrder, + FillDirection = Enum.FillDirection.Horizontal, + ItemLineAlignment = Enum.ItemLineAlignment.Center, + VerticalAlignment = Enum.VerticalAlignment.Center, + HorizontalAlignment = Enum.HorizontalAlignment.Center, + }), + _new("TextLabel")({ + Text = textState, + Visible = _Computed(function(txt: string): boolean + return txt:len() > 0 + end, textState), + TextScaled = true, + TextXAlignment = LABEL_TEXT_ALIGNMENT, + TextYAlignment = Enum.TextYAlignment.Center, + BackgroundTransparency = 1, + AutomaticSize = Enum.AutomaticSize.X, + FontFace = fontState, + LayoutOrder = 2, + TextColor3 = _Computed(function(style: TextStyle): Color3 + return style.TextColor3 + end, currentStyleState), + TextTransparency = _Computed(function(style: TextStyle): number + return style.TextTransparency + end, currentStyleState), + Size = _Computed(function(s: number): UDim2 + return UDim2.fromOffset(0, s * ICON_SIZE_DP) + end, scaleState), + }), + _new("ImageLabel")({ + Name = "Icon", + LayoutOrder = 1, + BackgroundTransparency = 1, + Visible = _Computed(function(icon: ImageData?): boolean + return icon ~= nil + end, iconState), + Image = _Computed(function(icon: ImageData?): string + return if icon then icon.Image else "" + end, iconState), + ImageColor3 = _Computed(function(icon: ImageData?, style: TextStyle?): Color3 + return if icon and style then style.TextColor3 else Color3.new(1, 1, 1) + end, iconState, currentStyleState), + ImageRectOffset = _Computed(function(icon: ImageData?): Vector2 + return if icon then icon.ImageRectOffset else Vector2.zero + end, iconState), + ImageRectSize = _Computed(function(icon: ImageData?): Vector2 + return if icon then icon.ImageRectSize else Vector2.zero + end, iconState), + ImageTransparency = _Computed(function(icon: ImageData?, style: TextStyle?): number + return if icon and style then style.TextTransparency else 1 + end, iconState, currentStyleState), + SizeConstraint = Enum.SizeConstraint.RelativeYY, + Size = _Computed(function(s: number): UDim2 + return UDim2.fromScale(1, 1) + -- return UDim2.fromOffset(s * ICON_SIZE_DP, s * ICON_SIZE_DP) + end, scaleState), + }), + _new("UIPadding")({ + PaddingLeft = _Computed( + function(s: number, icon: ImageData?, txt: string, padScale: number): UDim + if icon then + if txt:len() > 0 then + return UDim.new(0, padScale * LEFT_PADDING_WITH_ICON_DP * s) + else + return UDim.new(0, padScale * s * (HEIGHT_DP - ICON_SIZE_DP) / 2) + end + else + return UDim.new(0, padScale * LEFT_RIGHT_PADDING_DP * s) + end + end, + scaleState, + iconState, + textState, + paddingScaleState + ), + PaddingRight = _Computed( + function(s: number, icon: ImageData?, txt: string, padScale: number): UDim + if icon then + if txt:len() > 0 then + return UDim.new(0, padScale * RIGHT_PADDING_WITH_ICON_DP * s) + else + return UDim.new(0, padScale * s * (HEIGHT_DP - ICON_SIZE_DP) / 2) + end + else + return UDim.new(0, padScale * LEFT_RIGHT_PADDING_DP * s) + end + end, + scaleState, + iconState, + textState, + paddingScaleState + ), + PaddingTop = _Computed(function(s: number, padScale: number): UDim + return UDim.new(0, padScale * s * (HEIGHT_DP - ICON_SIZE_DP) / 2) + end, scaleState, paddingScaleState), + PaddingBottom = _Computed(function(s: number, padScale: number): UDim + return UDim.new(0, padScale * s * (HEIGHT_DP - ICON_SIZE_DP) / 2) + end, scaleState, paddingScaleState), + }), + _new("UISizeConstraint")({ + MaxSize = Vector2.new(math.huge, math.huge), + MinSize = _Computed(function(s: number, hasMin: boolean): Vector2 + if hasMin then + return Vector2.new(s * CONTAINER_WIDTH_MIN_DP, 0) + else + return Vector2.new(0, 0) + end + end, scaleState, hasMinState), + }), + }, + }) :: TextButton, }, - }) :: TextButton, - }, - }) :: ImageLabel + }) + } + }) :: Frame + return inst end diff --git a/src/Types.luau b/src/Types.luau index fedc0680..c37b53f9 100644 --- a/src/Types.luau +++ b/src/Types.luau @@ -31,6 +31,12 @@ export type ToggleTextStyle = { Selected: TextStyle, Unselected: TextStyle, } +export type ButtonData = { + Icon: ImageData?, + Text: string?, + Enabled: boolean, + OnClick: () -> () +} export type OptionData = { Text: string, Icon: ImageData?, @@ -47,6 +53,20 @@ export type OptionData = { -- Class local Types = {} +function Types.newButtonData( + onClick: () -> (), + icon: ImageData?, + text: string?, + enabled: boolean? +): ButtonData + return { + Icon = icon, + Text = text, + OnClick = onClick, + Enabled = if enabled == nil then true else enabled + } +end + function Types.newOptionData( onSelect: (isSelected: boolean) -> (), disabled: boolean, diff --git a/src/Util.luau b/src/Util.luau index 1ed57359..e0a9e7a9 100644 --- a/src/Util.luau +++ b/src/Util.luau @@ -19,7 +19,7 @@ local MIN_HEX_DIFFERENCE = 100 / 255 local DEFAULT_CONTRAST_RATIO = 4.5 local BLACK_COLOR = Color3.new(0, 0, 0) local WHITE_COLOR = Color3.new(1, 1, 1) -local MAX_ELEVATION = 16 +local MAX_ELEVATION = 8 -- Variables -- References -- Private Functions @@ -142,12 +142,12 @@ end function Util.getElevatedColor(color: Color3, elevation: number, isDarkMode: boolean): Color3 elevation = math.clamp(elevation, 0, MAX_ELEVATION) - local alpha = 1 - CurveUtil.ease(elevation / MAX_ELEVATION, Enum.EasingStyle.Quad, Enum.EasingDirection.In) + local alpha = CurveUtil.ease(elevation / MAX_ELEVATION, Enum.EasingStyle.Quad, Enum.EasingDirection.In) if isDarkMode then - return CurveUtil.lerp(color, Color3.new(1, 1, 1), alpha * 0.1) + return CurveUtil.lerp(color, Color3.new(1, 1, 1), alpha*0.75) else - return CurveUtil.lerp(color, Color3.new(1, 1, 1), alpha * 0.25) + return CurveUtil.lerp(color, Color3.new(1, 1, 1), alpha*0.95) end end diff --git a/src/init.luau b/src/init.luau index db011924..5ac37713 100644 --- a/src/init.luau +++ b/src/init.luau @@ -1,15 +1,50 @@ --!strict +local ReplicatedStorage = game:GetService("ReplicatedStorage") local _Package = script local _Packages = _Package.Parent -- Services -- Packages -- Modules +local Util = require(ReplicatedStorage.Packages.synthetic.Util) +local Types = require(_Package:WaitForChild("Types")) + -- Types +export type ThemeData = Types.ThemeData +export type ImageData = Types.ImageData +export type Style = Types.Style +export type TextStyle = Types.TextStyle +export type ToggleTextStyle = Types.ToggleTextStyle +export type OptionData = Types.OptionData -- Constants -- Variables -- References +local Component = _Package:WaitForChild("Component") -- Private Functions -- Class local Synthetic = {} +Synthetic.Enums = require(_Package:WaitForChild("Enums")) +Synthetic.Sounds = require(_Package:WaitForChild("Sounds")) +Synthetic.Types = Types +Synthetic.Util = require(_Package:WaitForChild("Util")) +Synthetic.Components = { + Bar = { + Bottom = require(Component:WaitForChild("Bar"):WaitForChild("Bottom")), + }, + Button = { + Badge = require(Component:WaitForChild("Button"):WaitForChild("Badge")), + ElevatedButton = require(Component:WaitForChild("Button"):WaitForChild("ElevatedButton")), + ExtendedFAB = require(Component:WaitForChild("Button"):WaitForChild("ExtendedFAB")), + FAB = require(Component:WaitForChild("Button"):WaitForChild("FAB")), + FilledButton = require(Component:WaitForChild("Button"):WaitForChild("FilledButton")), + FilledIconButton = require(Component:WaitForChild("Button"):WaitForChild("FilledIconButton")), + IconButton = require(Component:WaitForChild("Button"):WaitForChild("IconButton")), + Outlined = require(Component:WaitForChild("Button"):WaitForChild("OutlinedButton")), + OutlinedIcon = require(Component:WaitForChild("Button"):WaitForChild("OutlinedIconButton")), + Segmented = require(Component:WaitForChild("Button"):WaitForChild("Segmented")), + Text = require(Component:WaitForChild("Button"):WaitForChild("TextButton")), + }, +} + + return Synthetic diff --git a/synthetic.rbxl.lock b/synthetic.rbxl.lock index e163dd24..4c2c48aa 100644 --- a/synthetic.rbxl.lock +++ b/synthetic.rbxl.lock @@ -1,4 +1,4 @@ -31672 +11484 RobloxStudioBeta DESKTOP-UIAPQFM faf3918c-cd67-4e9b-95e8-76107b83bc31 diff --git a/wally.lock b/wally.lock index d30660d8..a1c194d9 100644 --- a/wally.lock +++ b/wally.lock @@ -60,7 +60,7 @@ dependencies = [] [[package]] name = "nightcycle/synthetic" version = "5.0.0" -dependencies = [["ColdFusion", "nightcycle/cold-fusion@9.0.7"], ["CurveUtil", "nightcycle/curve-util@1.0.0"], ["Format", "nightcycle/format@0.1.3"], ["Fusion", "elttob/fusion@0.2.0"], ["Maid", "nightcycle/maid@1.1.4"], ["MaterialIcons", "nightcycle/material-icons@1.0.1"], ["MeshUtil", "nightcycle/mesh-util@1.0.3"], ["Roact", "roblox/roact@1.4.4"], ["Signal", "nightcycle/signal@1.0.2"]] +dependencies = [["ColdFusion", "nightcycle/cold-fusion@9.0.7"], ["CurveUtil", "nightcycle/curve-util@1.0.0"], ["Format", "nightcycle/format@0.1.3"], ["Fusion", "elttob/fusion@0.2.0"], ["Maid", "nightcycle/maid@1.1.4"], ["MaterialIcons", "nightcycle/material-icons@1.0.1"], ["MeshUtil", "nightcycle/mesh-util@1.0.3"], ["Roact", "roblox/roact@1.4.4"], ["Signal", "nightcycle/signal@1.0.2"], ["TableUtil", "nightcycle/table-util@1.1.0"]] [[package]] name = "nightcycle/table-util" diff --git a/wally.toml b/wally.toml index 7e5d4bf3..5d71105e 100644 --- a/wally.toml +++ b/wally.toml @@ -16,4 +16,5 @@ MeshUtil = "nightcycle/mesh-util@1.0.3" Fusion = "elttob/fusion@0.2.0" Roact = "roblox/roact@1.4.0" MaterialIcons = "nightcycle/material-icons@1.0.1" -CurveUtil = "nightcycle/curve-util@1.0.0" \ No newline at end of file +CurveUtil = "nightcycle/curve-util@1.0.0" +TableUtil = "nightcycle/table-util@1.1.0" \ No newline at end of file From 9c8dad693a5a9ebbc17048b5bdca8425d3799c08 Mon Sep 17 00:00:00 2001 From: Nightcycle <77173389+nightcycle@users.noreply.github.com> Date: Thu, 7 Dec 2023 13:09:53 -0500 Subject: [PATCH 17/57] Added top bar --- sourcemap.json | 2 +- src/Component/Bar/Bottom/init.luau | 9 +- src/Component/Bar/Top/Base.luau | 314 ++++++++++++++++++ .../Bar/Top/Center/cfusion.story.luau | 87 +++++ src/Component/Bar/Top/Center/init.luau | 51 +++ .../Bar/Top/Large/cfusion.story.luau | 87 +++++ src/Component/Bar/Top/Large/init.luau | 51 +++ .../Bar/Top/Medium/cfusion.story.luau | 87 +++++ src/Component/Bar/Top/Medium/init.luau | 51 +++ .../Bar/Top/Small/cfusion.story.luau | 87 +++++ src/Component/Bar/Top/Small/init.luau | 51 +++ 11 files changed, 868 insertions(+), 9 deletions(-) create mode 100644 src/Component/Bar/Top/Base.luau create mode 100644 src/Component/Bar/Top/Center/cfusion.story.luau create mode 100644 src/Component/Bar/Top/Center/init.luau create mode 100644 src/Component/Bar/Top/Large/cfusion.story.luau create mode 100644 src/Component/Bar/Top/Large/init.luau create mode 100644 src/Component/Bar/Top/Medium/cfusion.story.luau create mode 100644 src/Component/Bar/Top/Medium/init.luau create mode 100644 src/Component/Bar/Top/Small/cfusion.story.luau create mode 100644 src/Component/Bar/Top/Small/init.luau diff --git a/sourcemap.json b/sourcemap.json index c7311d1d..5c28f812 100644 --- a/sourcemap.json +++ b/sourcemap.json @@ -1 +1 @@ -{"name":"synthetic-test","className":"DataModel","filePaths":["dev.project.json"],"children":[{"name":"ReplicatedStorage","className":"ReplicatedStorage","children":[{"name":"Packages","className":"Folder","children":[{"name":"ColdFusion","className":"ModuleScript","filePaths":["Packages\\ColdFusion.lua"]},{"name":"CurveUtil","className":"ModuleScript","filePaths":["Packages\\CurveUtil.lua"]},{"name":"Format","className":"ModuleScript","filePaths":["Packages\\Format.lua"]},{"name":"Fusion","className":"ModuleScript","filePaths":["Packages\\Fusion.lua"]},{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\Maid.lua"]},{"name":"MaterialIcons","className":"ModuleScript","filePaths":["Packages\\MaterialIcons.lua"]},{"name":"MeshUtil","className":"ModuleScript","filePaths":["Packages\\MeshUtil.lua"]},{"name":"Roact","className":"ModuleScript","filePaths":["Packages\\Roact.lua"]},{"name":"Signal","className":"ModuleScript","filePaths":["Packages\\Signal.lua"]},{"name":"TableUtil","className":"ModuleScript","filePaths":["Packages\\TableUtil.lua"]},{"name":"_Index","className":"Folder","children":[{"name":"elttob_fusion@0.2.0","className":"Folder","children":[{"name":"fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\init.lua","Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\default.project.json"],"children":[{"name":"Animation","className":"Folder","children":[{"name":"Spring","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\Spring.lua"]},{"name":"SpringScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\SpringScheduler.lua"]},{"name":"Tween","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\Tween.lua"]},{"name":"TweenScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\TweenScheduler.lua"]},{"name":"getTweenRatio","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\getTweenRatio.lua"]},{"name":"lerpType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\lerpType.lua"]},{"name":"packType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\packType.lua"]},{"name":"springCoefficients","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\springCoefficients.lua"]},{"name":"unpackType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\unpackType.lua"]}]},{"name":"Colour","className":"Folder","children":[{"name":"Oklab","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Colour\\Oklab.lua"]}]},{"name":"Dependencies","className":"Folder","children":[{"name":"captureDependencies","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\captureDependencies.lua"]},{"name":"initDependency","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\initDependency.lua"]},{"name":"sharedState","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\sharedState.lua"]},{"name":"updateAll","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\updateAll.lua"]},{"name":"useDependency","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\useDependency.lua"]}]},{"name":"Instances","className":"Folder","children":[{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Children.lua"]},{"name":"Cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Cleanup.lua"]},{"name":"Hydrate","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Hydrate.lua"]},{"name":"New","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\New.lua"]},{"name":"OnChange","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\OnChange.lua"]},{"name":"OnEvent","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\OnEvent.lua"]},{"name":"Out","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Out.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Ref.lua"]},{"name":"applyInstanceProps","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\applyInstanceProps.lua"]},{"name":"defaultProps","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\defaultProps.lua"]}]},{"name":"Logging","className":"Folder","children":[{"name":"logError","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logError.lua"]},{"name":"logErrorNonFatal","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logErrorNonFatal.lua"]},{"name":"logWarn","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logWarn.lua"]},{"name":"messages","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\messages.lua"]},{"name":"parseError","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\parseError.lua"]}]},{"name":"PubTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\PubTypes.lua"]},{"name":"State","className":"Folder","children":[{"name":"Computed","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Computed.lua"]},{"name":"ForKeys","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForKeys.lua"]},{"name":"ForPairs","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForPairs.lua"]},{"name":"ForValues","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForValues.lua"]},{"name":"Observer","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Observer.lua"]},{"name":"Value","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Value.lua"]},{"name":"unwrap","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\unwrap.lua"]}]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Types.lua"]},{"name":"Utility","className":"Folder","children":[{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\None.lua"]},{"name":"cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\cleanup.lua"]},{"name":"doNothing","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\doNothing.lua"]},{"name":"isSimilar","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\isSimilar.lua"]},{"name":"needsDestruction","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\needsDestruction.lua"]},{"name":"restrictRead","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\restrictRead.lua"]},{"name":"xtypeof","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\xtypeof.lua"]}]}]}]},{"name":"nightcycle_cold-fusion@9.0.7","className":"Folder","children":[{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\Maid.lua"]},{"name":"ServiceProxy","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\ServiceProxy.lua"]},{"name":"Signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\Signal.lua"]},{"name":"TableUtil","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\TableUtil.lua"]},{"name":"cold-fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\init.luau","Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\default.project.json"],"children":[{"name":"Fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\init.lua"],"children":[{"name":"Animation","className":"Folder","children":[{"name":"Spring","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\Spring.lua"]},{"name":"SpringScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\SpringScheduler.lua"]},{"name":"Tween","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\Tween.lua"]},{"name":"TweenScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\TweenScheduler.lua"]},{"name":"getTweenRatio","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\getTweenRatio.lua"]},{"name":"lerpType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\lerpType.lua"]},{"name":"packType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\packType.lua"]},{"name":"springCoefficients","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\springCoefficients.lua"]},{"name":"unpackType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\unpackType.lua"]}]},{"name":"Colour","className":"Folder","children":[{"name":"Oklab","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Colour\\Oklab.lua"]}]},{"name":"Instances","className":"Folder","children":[{"name":"Attribute","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Attribute.lua"]},{"name":"AttributeChange","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\AttributeChange.lua"]},{"name":"AttributeOut","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\AttributeOut.lua"]},{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Children.lua"]},{"name":"Cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Cleanup.lua"]},{"name":"Hydrate","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Hydrate.lua"]},{"name":"New","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\New.lua"]},{"name":"OnChange","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\OnChange.lua"]},{"name":"OnEvent","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\OnEvent.lua"]},{"name":"Out","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Out.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Ref.lua"]},{"name":"applyInstanceProps","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\applyInstanceProps.lua"]},{"name":"defaultProps","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\defaultProps.lua"]}]},{"name":"Logging","className":"Folder","children":[{"name":"logError","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logError.lua"]},{"name":"logErrorNonFatal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logErrorNonFatal.lua"]},{"name":"logWarn","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logWarn.lua"]},{"name":"messages","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\messages.lua"]},{"name":"parseError","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\parseError.lua"]}]},{"name":"PubTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\PubTypes.lua"]},{"name":"State","className":"Folder","children":[{"name":"Computed","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Computed.lua"]},{"name":"ForKeys","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForKeys.lua"]},{"name":"ForPairs","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForPairs.lua"]},{"name":"ForValues","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForValues.lua"]},{"name":"Observer","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Observer.lua"]},{"name":"Value","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Value.lua"]},{"name":"isState","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\isState.lua"]},{"name":"makeUseCallback","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\makeUseCallback.lua"]},{"name":"peek","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\peek.lua"]},{"name":"updateAll","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\updateAll.lua"]}]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Types.lua"]},{"name":"Utility","className":"Folder","children":[{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\None.lua"]},{"name":"cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\cleanup.lua"]},{"name":"doNothing","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\doNothing.lua"]},{"name":"isSimilar","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\isSimilar.lua"]},{"name":"needsDestruction","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\needsDestruction.lua"]},{"name":"restrictRead","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\restrictRead.lua"]},{"name":"xtypeof","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\xtypeof.lua"]}]}]},{"name":"InstanceTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\InstanceTypes.luau"]},{"name":"Interface","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Interface.luau"]},{"name":"Test.story","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Test.story.luau"]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Types.luau"]},{"name":"Util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Util.luau"]}]}]},{"name":"nightcycle_curve-util@1.0.0","className":"Folder","children":[{"name":"Vector","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\Vector.lua"]},{"name":"curve-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\init.lua","Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\default.project.json"],"children":[{"name":"Ease","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\Ease.lua"]},{"name":"Lerp","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\Lerp.lua"]}]}]},{"name":"nightcycle_format@0.1.3","className":"Folder","children":[{"name":"format","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\init.lua","Packages\\_Index\\nightcycle_format@0.1.3\\format\\default.project.json"],"children":[{"name":"Emoji","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\Emoji.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\init.spec.lua"]}]},{"name":"maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\maid.lua"]},{"name":"signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\signal.lua"]},{"name":"string","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\string.lua"]}]},{"name":"nightcycle_geometry-util@1.1.1","className":"Folder","children":[{"name":"geometry-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\init.lua","Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\default.project.json"],"children":[{"name":"Earcut","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\Earcut\\init.lua"],"children":[{"name":"ZeroArray","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\Earcut\\ZeroArray.lua"]}]}]}]},{"name":"nightcycle_maid@1.1.4","className":"Folder","children":[{"name":"maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\init.lua","Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\default.project.json"],"children":[{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\Maid.lua"]},{"name":"MaidTaskUtils","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\MaidTaskUtils.lua"]}]}]},{"name":"nightcycle_material-icons@1.0.1","className":"Folder","children":[{"name":"material-icons","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\init.luau","Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\default.project.json"],"children":[{"name":"Default_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_1.luau"]},{"name":"Default_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_2.luau"]},{"name":"Default_18_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_3.luau"]},{"name":"Default_18_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_4.luau"]},{"name":"Default_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_1.luau"]},{"name":"Default_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_2.luau"]},{"name":"Default_24_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_3.luau"]},{"name":"Default_24_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_4.luau"]},{"name":"Default_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_1.luau"]},{"name":"Default_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_2.luau"]},{"name":"Default_36_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_3.luau"]},{"name":"Default_36_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_4.luau"]},{"name":"Default_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_1.luau"]},{"name":"Default_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_2.luau"]},{"name":"Default_48_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_3.luau"]},{"name":"Default_48_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_4.luau"]},{"name":"Outlined_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_18_1.luau"]},{"name":"Outlined_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_18_2.luau"]},{"name":"Outlined_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_24_1.luau"]},{"name":"Outlined_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_24_2.luau"]},{"name":"Outlined_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_36_1.luau"]},{"name":"Outlined_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_36_2.luau"]},{"name":"Outlined_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_48_1.luau"]},{"name":"Outlined_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_48_2.luau"]},{"name":"Round_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_18_1.luau"]},{"name":"Round_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_18_2.luau"]},{"name":"Round_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_24_1.luau"]},{"name":"Round_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_24_2.luau"]},{"name":"Round_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_36_1.luau"]},{"name":"Round_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_36_2.luau"]},{"name":"Round_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_48_1.luau"]},{"name":"Round_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_48_2.luau"]},{"name":"Sharp_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_18_1.luau"]},{"name":"Sharp_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_18_2.luau"]},{"name":"Sharp_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_24_1.luau"]},{"name":"Sharp_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_24_2.luau"]},{"name":"Sharp_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_36_1.luau"]},{"name":"Sharp_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_36_2.luau"]},{"name":"Sharp_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_48_1.luau"]},{"name":"Sharp_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_48_2.luau"]},{"name":"TwoTone_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_18_1.luau"]},{"name":"TwoTone_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_18_2.luau"]},{"name":"TwoTone_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_24_1.luau"]},{"name":"TwoTone_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_24_2.luau"]},{"name":"TwoTone_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_36_1.luau"]},{"name":"TwoTone_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_36_2.luau"]},{"name":"TwoTone_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_48_1.luau"]},{"name":"TwoTone_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_48_2.luau"]}]}]},{"name":"nightcycle_mesh-util@1.0.3","className":"Folder","children":[{"name":"GeometryUtil","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\GeometryUtil.lua"]},{"name":"mesh-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\init.lua","Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\default.project.json"],"children":[{"name":"CornerWedgePart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\CornerWedgePart.lua"]},{"name":"Part","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\Part.lua"]},{"name":"TetraPart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\TetraPart.lua"]},{"name":"WedgePart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\WedgePart.lua"]}]}]},{"name":"nightcycle_service-proxy@1.0.0","className":"Folder","children":[{"name":"service-proxy","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_service-proxy@1.0.0\\service-proxy\\src\\init.lua","Packages\\_Index\\nightcycle_service-proxy@1.0.0\\service-proxy\\default.project.json"]}]},{"name":"nightcycle_signal@1.0.2","className":"Folder","children":[{"name":"signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_signal@1.0.2\\signal\\src\\init.lua","Packages\\_Index\\nightcycle_signal@1.0.2\\signal\\default.project.json"]}]},{"name":"nightcycle_string@0.1.0","className":"Folder","children":[{"name":"string","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_string@0.1.0\\string\\src\\init.lua","Packages\\_Index\\nightcycle_string@0.1.0\\string\\default.project.json"],"children":[{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_string@0.1.0\\string\\src\\init.spec.lua"]}]}]},{"name":"nightcycle_table-util@1.1.0","className":"Folder","children":[{"name":"table-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_table-util@1.1.0\\table-util\\src\\init.lua","Packages\\_Index\\nightcycle_table-util@1.1.0\\table-util\\default.project.json"]}]},{"name":"nightcycle_vector@1.0.2","className":"Folder","children":[{"name":"vector","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_vector@1.0.2\\vector\\src\\init.lua","Packages\\_Index\\nightcycle_vector@1.0.2\\vector\\default.project.json"]}]},{"name":"roblox_roact@1.4.4","className":"Folder","children":[{"name":"roact","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\init.lua","Packages\\_Index\\roblox_roact@1.4.4\\roact\\default.project.json"],"children":[{"name":"Binding","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Binding.lua"]},{"name":"Binding.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Binding.spec.lua"]},{"name":"Component","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.lua"]},{"name":"Component.spec","className":"Folder","children":[{"name":"context.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\context.spec.lua"]},{"name":"defaultProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\defaultProps.spec.lua"]},{"name":"didMount.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\didMount.spec.lua"]},{"name":"didUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\didUpdate.spec.lua"]},{"name":"extend.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\extend.spec.lua"]},{"name":"getDerivedStateFromProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\getDerivedStateFromProps.spec.lua"]},{"name":"getElementTraceback.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\getElementTraceback.spec.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\init.spec.lua"]},{"name":"legacyContext.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\legacyContext.spec.lua"]},{"name":"render.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\render.spec.lua"]},{"name":"setState.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\setState.spec.lua"]},{"name":"shouldUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\shouldUpdate.spec.lua"]},{"name":"validateProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\validateProps.spec.lua"]},{"name":"willUnmount.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\willUnmount.spec.lua"]},{"name":"willUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\willUpdate.spec.lua"]}]},{"name":"ComponentLifecyclePhase","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ComponentLifecyclePhase.lua"]},{"name":"Config","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Config.lua"]},{"name":"Config.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Config.spec.lua"]},{"name":"ElementKind","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementKind.lua"]},{"name":"ElementKind.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementKind.spec.lua"]},{"name":"ElementUtils","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementUtils.lua"]},{"name":"ElementUtils.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementUtils.spec.lua"]},{"name":"GlobalConfig","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\GlobalConfig.lua"]},{"name":"GlobalConfig.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\GlobalConfig.spec.lua"]},{"name":"Logging","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Logging.lua"]},{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\None.lua"]},{"name":"NoopRenderer","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\NoopRenderer.lua"]},{"name":"Portal","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Portal.lua"]},{"name":"PropMarkers","className":"Folder","children":[{"name":"Change","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Change.lua"]},{"name":"Change.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Change.spec.lua"]},{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Children.lua"]},{"name":"Event","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Event.lua"]},{"name":"Event.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Event.spec.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Ref.lua"]}]},{"name":"PureComponent","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PureComponent.lua"]},{"name":"PureComponent.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PureComponent.spec.lua"]},{"name":"RobloxRenderer","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\RobloxRenderer.lua"]},{"name":"RobloxRenderer.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\RobloxRenderer.spec.lua"]},{"name":"SingleEventManager","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\SingleEventManager.lua"]},{"name":"SingleEventManager.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\SingleEventManager.spec.lua"]},{"name":"Symbol","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Symbol.lua"]},{"name":"Symbol.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Symbol.spec.lua"]},{"name":"Type","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Type.lua"]},{"name":"Type.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Type.spec.lua"]},{"name":"assertDeepEqual","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assertDeepEqual.lua"]},{"name":"assertDeepEqual.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assertDeepEqual.spec.lua"]},{"name":"assign","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assign.lua"]},{"name":"assign.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assign.spec.lua"]},{"name":"createContext","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createContext.lua"]},{"name":"createContext.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createContext.spec.lua"]},{"name":"createElement","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createElement.lua"]},{"name":"createElement.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createElement.spec.lua"]},{"name":"createFragment","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createFragment.lua"]},{"name":"createFragment.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createFragment.spec.lua"]},{"name":"createReconciler","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconciler.lua"]},{"name":"createReconciler.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconciler.spec.lua"]},{"name":"createReconcilerCompat","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconcilerCompat.lua"]},{"name":"createReconcilerCompat.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconcilerCompat.spec.lua"]},{"name":"createRef","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createRef.lua"]},{"name":"createRef.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createRef.spec.lua"]},{"name":"createSignal","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSignal.lua"]},{"name":"createSignal.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSignal.spec.lua"]},{"name":"createSpy","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSpy.lua"]},{"name":"createSpy.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSpy.spec.lua"]},{"name":"forwardRef","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\forwardRef.lua"]},{"name":"forwardRef.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\forwardRef.spec.lua"]},{"name":"getDefaultInstanceProperty","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\getDefaultInstanceProperty.lua"]},{"name":"getDefaultInstanceProperty.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\getDefaultInstanceProperty.spec.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\init.spec.lua"]},{"name":"internalAssert","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\internalAssert.lua"]},{"name":"invalidSetStateMessages","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\invalidSetStateMessages.lua"]},{"name":"oneChild","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\oneChild.lua"]},{"name":"oneChild.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\oneChild.spec.lua"]},{"name":"strict","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\strict.lua"]},{"name":"strict.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\strict.spec.lua"]}]}]}]},{"name":"synthetic","className":"ModuleScript","filePaths":["src\\init.luau"],"children":[{"name":"Component","className":"Folder","children":[{"name":"Bar","className":"Folder","children":[{"name":"Bottom","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Bottom\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Bottom\\cfusion.story.luau"]}]}]},{"name":"Button","className":"Folder","children":[{"name":"Badge","className":"ModuleScript","filePaths":["src\\Component\\Button\\Badge\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\Badge\\cfusion.story.luau"]}]},{"name":"Base","className":"ModuleScript","filePaths":["src\\Component\\Button\\Base.luau"]},{"name":"ElevatedButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\ElevatedButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\ElevatedButton\\cfusion.story.luau"]}]},{"name":"ExtendedFAB","className":"ModuleScript","filePaths":["src\\Component\\Button\\ExtendedFAB\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\ExtendedFAB\\cfusion.story.luau"]}]},{"name":"FAB","className":"ModuleScript","filePaths":["src\\Component\\Button\\FAB\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\FAB\\cfusion.story.luau"]}]},{"name":"FilledButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledButton\\cfusion.story.luau"]}]},{"name":"FilledIconButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledIconButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledIconButton\\cfusion.story.luau"]}]},{"name":"IconButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\IconButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\IconButton\\cfusion.story.luau"]}]},{"name":"OutlinedButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedButton\\cfusion.story.luau"]}]},{"name":"OutlinedIconButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedIconButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedIconButton\\cfusion.story.luau"]}]},{"name":"Segmented","className":"ModuleScript","filePaths":["src\\Component\\Button\\Segmented\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\Segmented\\cfusion.story.luau"]}]},{"name":"TextButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\TextButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\TextButton\\cfusion.story.luau"]}]}]}]},{"name":"Config","className":"ModuleScript","filePaths":["src\\Config.luau"]},{"name":"Enums","className":"ModuleScript","filePaths":["src\\Enums.luau"]},{"name":"Sounds","className":"ModuleScript","filePaths":["src\\Sounds.luau"]},{"name":"Test","className":"Folder","children":[{"name":"Source.cfusion","className":"ModuleScript","filePaths":["src\\Test\\Source.cfusion.luau"]}]},{"name":"Types","className":"ModuleScript","filePaths":["src\\Types.luau"]},{"name":"Util","className":"ModuleScript","filePaths":["src\\Util.luau"]}]}]}]}]} \ No newline at end of file +{"name":"synthetic-test","className":"DataModel","filePaths":["dev.project.json"],"children":[{"name":"ReplicatedStorage","className":"ReplicatedStorage","children":[{"name":"Packages","className":"Folder","children":[{"name":"ColdFusion","className":"ModuleScript","filePaths":["Packages\\ColdFusion.lua"]},{"name":"CurveUtil","className":"ModuleScript","filePaths":["Packages\\CurveUtil.lua"]},{"name":"Format","className":"ModuleScript","filePaths":["Packages\\Format.lua"]},{"name":"Fusion","className":"ModuleScript","filePaths":["Packages\\Fusion.lua"]},{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\Maid.lua"]},{"name":"MaterialIcons","className":"ModuleScript","filePaths":["Packages\\MaterialIcons.lua"]},{"name":"MeshUtil","className":"ModuleScript","filePaths":["Packages\\MeshUtil.lua"]},{"name":"Roact","className":"ModuleScript","filePaths":["Packages\\Roact.lua"]},{"name":"Signal","className":"ModuleScript","filePaths":["Packages\\Signal.lua"]},{"name":"TableUtil","className":"ModuleScript","filePaths":["Packages\\TableUtil.lua"]},{"name":"_Index","className":"Folder","children":[{"name":"elttob_fusion@0.2.0","className":"Folder","children":[{"name":"fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\init.lua","Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\default.project.json"],"children":[{"name":"Animation","className":"Folder","children":[{"name":"Spring","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\Spring.lua"]},{"name":"SpringScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\SpringScheduler.lua"]},{"name":"Tween","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\Tween.lua"]},{"name":"TweenScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\TweenScheduler.lua"]},{"name":"getTweenRatio","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\getTweenRatio.lua"]},{"name":"lerpType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\lerpType.lua"]},{"name":"packType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\packType.lua"]},{"name":"springCoefficients","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\springCoefficients.lua"]},{"name":"unpackType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\unpackType.lua"]}]},{"name":"Colour","className":"Folder","children":[{"name":"Oklab","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Colour\\Oklab.lua"]}]},{"name":"Dependencies","className":"Folder","children":[{"name":"captureDependencies","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\captureDependencies.lua"]},{"name":"initDependency","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\initDependency.lua"]},{"name":"sharedState","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\sharedState.lua"]},{"name":"updateAll","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\updateAll.lua"]},{"name":"useDependency","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\useDependency.lua"]}]},{"name":"Instances","className":"Folder","children":[{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Children.lua"]},{"name":"Cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Cleanup.lua"]},{"name":"Hydrate","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Hydrate.lua"]},{"name":"New","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\New.lua"]},{"name":"OnChange","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\OnChange.lua"]},{"name":"OnEvent","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\OnEvent.lua"]},{"name":"Out","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Out.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Ref.lua"]},{"name":"applyInstanceProps","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\applyInstanceProps.lua"]},{"name":"defaultProps","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\defaultProps.lua"]}]},{"name":"Logging","className":"Folder","children":[{"name":"logError","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logError.lua"]},{"name":"logErrorNonFatal","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logErrorNonFatal.lua"]},{"name":"logWarn","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logWarn.lua"]},{"name":"messages","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\messages.lua"]},{"name":"parseError","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\parseError.lua"]}]},{"name":"PubTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\PubTypes.lua"]},{"name":"State","className":"Folder","children":[{"name":"Computed","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Computed.lua"]},{"name":"ForKeys","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForKeys.lua"]},{"name":"ForPairs","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForPairs.lua"]},{"name":"ForValues","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForValues.lua"]},{"name":"Observer","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Observer.lua"]},{"name":"Value","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Value.lua"]},{"name":"unwrap","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\unwrap.lua"]}]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Types.lua"]},{"name":"Utility","className":"Folder","children":[{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\None.lua"]},{"name":"cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\cleanup.lua"]},{"name":"doNothing","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\doNothing.lua"]},{"name":"isSimilar","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\isSimilar.lua"]},{"name":"needsDestruction","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\needsDestruction.lua"]},{"name":"restrictRead","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\restrictRead.lua"]},{"name":"xtypeof","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\xtypeof.lua"]}]}]}]},{"name":"nightcycle_cold-fusion@9.0.7","className":"Folder","children":[{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\Maid.lua"]},{"name":"ServiceProxy","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\ServiceProxy.lua"]},{"name":"Signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\Signal.lua"]},{"name":"TableUtil","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\TableUtil.lua"]},{"name":"cold-fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\init.luau","Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\default.project.json"],"children":[{"name":"Fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\init.lua"],"children":[{"name":"Animation","className":"Folder","children":[{"name":"Spring","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\Spring.lua"]},{"name":"SpringScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\SpringScheduler.lua"]},{"name":"Tween","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\Tween.lua"]},{"name":"TweenScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\TweenScheduler.lua"]},{"name":"getTweenRatio","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\getTweenRatio.lua"]},{"name":"lerpType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\lerpType.lua"]},{"name":"packType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\packType.lua"]},{"name":"springCoefficients","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\springCoefficients.lua"]},{"name":"unpackType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\unpackType.lua"]}]},{"name":"Colour","className":"Folder","children":[{"name":"Oklab","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Colour\\Oklab.lua"]}]},{"name":"Instances","className":"Folder","children":[{"name":"Attribute","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Attribute.lua"]},{"name":"AttributeChange","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\AttributeChange.lua"]},{"name":"AttributeOut","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\AttributeOut.lua"]},{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Children.lua"]},{"name":"Cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Cleanup.lua"]},{"name":"Hydrate","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Hydrate.lua"]},{"name":"New","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\New.lua"]},{"name":"OnChange","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\OnChange.lua"]},{"name":"OnEvent","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\OnEvent.lua"]},{"name":"Out","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Out.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Ref.lua"]},{"name":"applyInstanceProps","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\applyInstanceProps.lua"]},{"name":"defaultProps","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\defaultProps.lua"]}]},{"name":"Logging","className":"Folder","children":[{"name":"logError","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logError.lua"]},{"name":"logErrorNonFatal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logErrorNonFatal.lua"]},{"name":"logWarn","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logWarn.lua"]},{"name":"messages","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\messages.lua"]},{"name":"parseError","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\parseError.lua"]}]},{"name":"PubTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\PubTypes.lua"]},{"name":"State","className":"Folder","children":[{"name":"Computed","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Computed.lua"]},{"name":"ForKeys","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForKeys.lua"]},{"name":"ForPairs","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForPairs.lua"]},{"name":"ForValues","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForValues.lua"]},{"name":"Observer","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Observer.lua"]},{"name":"Value","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Value.lua"]},{"name":"isState","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\isState.lua"]},{"name":"makeUseCallback","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\makeUseCallback.lua"]},{"name":"peek","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\peek.lua"]},{"name":"updateAll","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\updateAll.lua"]}]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Types.lua"]},{"name":"Utility","className":"Folder","children":[{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\None.lua"]},{"name":"cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\cleanup.lua"]},{"name":"doNothing","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\doNothing.lua"]},{"name":"isSimilar","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\isSimilar.lua"]},{"name":"needsDestruction","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\needsDestruction.lua"]},{"name":"restrictRead","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\restrictRead.lua"]},{"name":"xtypeof","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\xtypeof.lua"]}]}]},{"name":"InstanceTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\InstanceTypes.luau"]},{"name":"Interface","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Interface.luau"]},{"name":"Test.story","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Test.story.luau"]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Types.luau"]},{"name":"Util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Util.luau"]}]}]},{"name":"nightcycle_curve-util@1.0.0","className":"Folder","children":[{"name":"Vector","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\Vector.lua"]},{"name":"curve-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\init.lua","Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\default.project.json"],"children":[{"name":"Ease","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\Ease.lua"]},{"name":"Lerp","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\Lerp.lua"]}]}]},{"name":"nightcycle_format@0.1.3","className":"Folder","children":[{"name":"format","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\init.lua","Packages\\_Index\\nightcycle_format@0.1.3\\format\\default.project.json"],"children":[{"name":"Emoji","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\Emoji.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\init.spec.lua"]}]},{"name":"maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\maid.lua"]},{"name":"signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\signal.lua"]},{"name":"string","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\string.lua"]}]},{"name":"nightcycle_geometry-util@1.1.1","className":"Folder","children":[{"name":"geometry-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\init.lua","Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\default.project.json"],"children":[{"name":"Earcut","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\Earcut\\init.lua"],"children":[{"name":"ZeroArray","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\Earcut\\ZeroArray.lua"]}]}]}]},{"name":"nightcycle_maid@1.1.4","className":"Folder","children":[{"name":"maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\init.lua","Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\default.project.json"],"children":[{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\Maid.lua"]},{"name":"MaidTaskUtils","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\MaidTaskUtils.lua"]}]}]},{"name":"nightcycle_material-icons@1.0.1","className":"Folder","children":[{"name":"material-icons","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\init.luau","Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\default.project.json"],"children":[{"name":"Default_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_1.luau"]},{"name":"Default_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_2.luau"]},{"name":"Default_18_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_3.luau"]},{"name":"Default_18_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_4.luau"]},{"name":"Default_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_1.luau"]},{"name":"Default_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_2.luau"]},{"name":"Default_24_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_3.luau"]},{"name":"Default_24_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_4.luau"]},{"name":"Default_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_1.luau"]},{"name":"Default_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_2.luau"]},{"name":"Default_36_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_3.luau"]},{"name":"Default_36_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_4.luau"]},{"name":"Default_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_1.luau"]},{"name":"Default_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_2.luau"]},{"name":"Default_48_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_3.luau"]},{"name":"Default_48_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_4.luau"]},{"name":"Outlined_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_18_1.luau"]},{"name":"Outlined_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_18_2.luau"]},{"name":"Outlined_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_24_1.luau"]},{"name":"Outlined_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_24_2.luau"]},{"name":"Outlined_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_36_1.luau"]},{"name":"Outlined_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_36_2.luau"]},{"name":"Outlined_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_48_1.luau"]},{"name":"Outlined_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_48_2.luau"]},{"name":"Round_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_18_1.luau"]},{"name":"Round_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_18_2.luau"]},{"name":"Round_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_24_1.luau"]},{"name":"Round_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_24_2.luau"]},{"name":"Round_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_36_1.luau"]},{"name":"Round_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_36_2.luau"]},{"name":"Round_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_48_1.luau"]},{"name":"Round_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_48_2.luau"]},{"name":"Sharp_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_18_1.luau"]},{"name":"Sharp_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_18_2.luau"]},{"name":"Sharp_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_24_1.luau"]},{"name":"Sharp_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_24_2.luau"]},{"name":"Sharp_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_36_1.luau"]},{"name":"Sharp_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_36_2.luau"]},{"name":"Sharp_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_48_1.luau"]},{"name":"Sharp_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_48_2.luau"]},{"name":"TwoTone_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_18_1.luau"]},{"name":"TwoTone_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_18_2.luau"]},{"name":"TwoTone_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_24_1.luau"]},{"name":"TwoTone_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_24_2.luau"]},{"name":"TwoTone_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_36_1.luau"]},{"name":"TwoTone_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_36_2.luau"]},{"name":"TwoTone_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_48_1.luau"]},{"name":"TwoTone_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_48_2.luau"]}]}]},{"name":"nightcycle_mesh-util@1.0.3","className":"Folder","children":[{"name":"GeometryUtil","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\GeometryUtil.lua"]},{"name":"mesh-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\init.lua","Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\default.project.json"],"children":[{"name":"CornerWedgePart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\CornerWedgePart.lua"]},{"name":"Part","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\Part.lua"]},{"name":"TetraPart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\TetraPart.lua"]},{"name":"WedgePart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\WedgePart.lua"]}]}]},{"name":"nightcycle_service-proxy@1.0.0","className":"Folder","children":[{"name":"service-proxy","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_service-proxy@1.0.0\\service-proxy\\src\\init.lua","Packages\\_Index\\nightcycle_service-proxy@1.0.0\\service-proxy\\default.project.json"]}]},{"name":"nightcycle_signal@1.0.2","className":"Folder","children":[{"name":"signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_signal@1.0.2\\signal\\src\\init.lua","Packages\\_Index\\nightcycle_signal@1.0.2\\signal\\default.project.json"]}]},{"name":"nightcycle_string@0.1.0","className":"Folder","children":[{"name":"string","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_string@0.1.0\\string\\src\\init.lua","Packages\\_Index\\nightcycle_string@0.1.0\\string\\default.project.json"],"children":[{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_string@0.1.0\\string\\src\\init.spec.lua"]}]}]},{"name":"nightcycle_table-util@1.1.0","className":"Folder","children":[{"name":"table-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_table-util@1.1.0\\table-util\\src\\init.lua","Packages\\_Index\\nightcycle_table-util@1.1.0\\table-util\\default.project.json"]}]},{"name":"nightcycle_vector@1.0.2","className":"Folder","children":[{"name":"vector","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_vector@1.0.2\\vector\\src\\init.lua","Packages\\_Index\\nightcycle_vector@1.0.2\\vector\\default.project.json"]}]},{"name":"roblox_roact@1.4.4","className":"Folder","children":[{"name":"roact","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\init.lua","Packages\\_Index\\roblox_roact@1.4.4\\roact\\default.project.json"],"children":[{"name":"Binding","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Binding.lua"]},{"name":"Binding.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Binding.spec.lua"]},{"name":"Component","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.lua"]},{"name":"Component.spec","className":"Folder","children":[{"name":"context.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\context.spec.lua"]},{"name":"defaultProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\defaultProps.spec.lua"]},{"name":"didMount.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\didMount.spec.lua"]},{"name":"didUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\didUpdate.spec.lua"]},{"name":"extend.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\extend.spec.lua"]},{"name":"getDerivedStateFromProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\getDerivedStateFromProps.spec.lua"]},{"name":"getElementTraceback.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\getElementTraceback.spec.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\init.spec.lua"]},{"name":"legacyContext.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\legacyContext.spec.lua"]},{"name":"render.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\render.spec.lua"]},{"name":"setState.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\setState.spec.lua"]},{"name":"shouldUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\shouldUpdate.spec.lua"]},{"name":"validateProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\validateProps.spec.lua"]},{"name":"willUnmount.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\willUnmount.spec.lua"]},{"name":"willUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\willUpdate.spec.lua"]}]},{"name":"ComponentLifecyclePhase","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ComponentLifecyclePhase.lua"]},{"name":"Config","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Config.lua"]},{"name":"Config.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Config.spec.lua"]},{"name":"ElementKind","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementKind.lua"]},{"name":"ElementKind.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementKind.spec.lua"]},{"name":"ElementUtils","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementUtils.lua"]},{"name":"ElementUtils.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementUtils.spec.lua"]},{"name":"GlobalConfig","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\GlobalConfig.lua"]},{"name":"GlobalConfig.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\GlobalConfig.spec.lua"]},{"name":"Logging","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Logging.lua"]},{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\None.lua"]},{"name":"NoopRenderer","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\NoopRenderer.lua"]},{"name":"Portal","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Portal.lua"]},{"name":"PropMarkers","className":"Folder","children":[{"name":"Change","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Change.lua"]},{"name":"Change.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Change.spec.lua"]},{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Children.lua"]},{"name":"Event","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Event.lua"]},{"name":"Event.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Event.spec.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Ref.lua"]}]},{"name":"PureComponent","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PureComponent.lua"]},{"name":"PureComponent.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PureComponent.spec.lua"]},{"name":"RobloxRenderer","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\RobloxRenderer.lua"]},{"name":"RobloxRenderer.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\RobloxRenderer.spec.lua"]},{"name":"SingleEventManager","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\SingleEventManager.lua"]},{"name":"SingleEventManager.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\SingleEventManager.spec.lua"]},{"name":"Symbol","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Symbol.lua"]},{"name":"Symbol.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Symbol.spec.lua"]},{"name":"Type","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Type.lua"]},{"name":"Type.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Type.spec.lua"]},{"name":"assertDeepEqual","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assertDeepEqual.lua"]},{"name":"assertDeepEqual.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assertDeepEqual.spec.lua"]},{"name":"assign","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assign.lua"]},{"name":"assign.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assign.spec.lua"]},{"name":"createContext","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createContext.lua"]},{"name":"createContext.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createContext.spec.lua"]},{"name":"createElement","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createElement.lua"]},{"name":"createElement.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createElement.spec.lua"]},{"name":"createFragment","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createFragment.lua"]},{"name":"createFragment.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createFragment.spec.lua"]},{"name":"createReconciler","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconciler.lua"]},{"name":"createReconciler.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconciler.spec.lua"]},{"name":"createReconcilerCompat","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconcilerCompat.lua"]},{"name":"createReconcilerCompat.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconcilerCompat.spec.lua"]},{"name":"createRef","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createRef.lua"]},{"name":"createRef.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createRef.spec.lua"]},{"name":"createSignal","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSignal.lua"]},{"name":"createSignal.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSignal.spec.lua"]},{"name":"createSpy","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSpy.lua"]},{"name":"createSpy.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSpy.spec.lua"]},{"name":"forwardRef","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\forwardRef.lua"]},{"name":"forwardRef.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\forwardRef.spec.lua"]},{"name":"getDefaultInstanceProperty","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\getDefaultInstanceProperty.lua"]},{"name":"getDefaultInstanceProperty.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\getDefaultInstanceProperty.spec.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\init.spec.lua"]},{"name":"internalAssert","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\internalAssert.lua"]},{"name":"invalidSetStateMessages","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\invalidSetStateMessages.lua"]},{"name":"oneChild","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\oneChild.lua"]},{"name":"oneChild.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\oneChild.spec.lua"]},{"name":"strict","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\strict.lua"]},{"name":"strict.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\strict.spec.lua"]}]}]}]},{"name":"synthetic","className":"ModuleScript","filePaths":["src\\init.luau"],"children":[{"name":"Component","className":"Folder","children":[{"name":"Bar","className":"Folder","children":[{"name":"Bottom","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Bottom\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Bottom\\cfusion.story.luau"]}]},{"name":"Top","className":"Folder","children":[{"name":"Base","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Base.luau"]},{"name":"Center","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Center\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Center\\cfusion.story.luau"]}]},{"name":"Large","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Large\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Large\\cfusion.story.luau"]}]},{"name":"Medium","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Medium\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Medium\\cfusion.story.luau"]}]},{"name":"Small","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Small\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Small\\cfusion.story.luau"]}]}]}]},{"name":"Button","className":"Folder","children":[{"name":"Badge","className":"ModuleScript","filePaths":["src\\Component\\Button\\Badge\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\Badge\\cfusion.story.luau"]}]},{"name":"Base","className":"ModuleScript","filePaths":["src\\Component\\Button\\Base.luau"]},{"name":"ElevatedButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\ElevatedButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\ElevatedButton\\cfusion.story.luau"]}]},{"name":"ExtendedFAB","className":"ModuleScript","filePaths":["src\\Component\\Button\\ExtendedFAB\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\ExtendedFAB\\cfusion.story.luau"]}]},{"name":"FAB","className":"ModuleScript","filePaths":["src\\Component\\Button\\FAB\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\FAB\\cfusion.story.luau"]}]},{"name":"FilledButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledButton\\cfusion.story.luau"]}]},{"name":"FilledIconButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledIconButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledIconButton\\cfusion.story.luau"]}]},{"name":"IconButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\IconButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\IconButton\\cfusion.story.luau"]}]},{"name":"OutlinedButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedButton\\cfusion.story.luau"]}]},{"name":"OutlinedIconButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedIconButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedIconButton\\cfusion.story.luau"]}]},{"name":"Segmented","className":"ModuleScript","filePaths":["src\\Component\\Button\\Segmented\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\Segmented\\cfusion.story.luau"]}]},{"name":"TextButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\TextButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\TextButton\\cfusion.story.luau"]}]}]}]},{"name":"Config","className":"ModuleScript","filePaths":["src\\Config.luau"]},{"name":"Enums","className":"ModuleScript","filePaths":["src\\Enums.luau"]},{"name":"Sounds","className":"ModuleScript","filePaths":["src\\Sounds.luau"]},{"name":"Test","className":"Folder","children":[{"name":"Source.cfusion","className":"ModuleScript","filePaths":["src\\Test\\Source.cfusion.luau"]}]},{"name":"Types","className":"ModuleScript","filePaths":["src\\Types.luau"]},{"name":"Util","className":"ModuleScript","filePaths":["src\\Util.luau"]}]}]}]}]} \ No newline at end of file diff --git a/src/Component/Bar/Bottom/init.luau b/src/Component/Bar/Bottom/init.luau index e3ac6c82..e134d61c 100644 --- a/src/Component/Bar/Bottom/init.luau +++ b/src/Component/Bar/Bottom/init.luau @@ -2,20 +2,14 @@ local _Package = script.Parent.Parent.Parent local _Packages = _Package.Parent -- Services -local SoundService = game:GetService("SoundService") - -- Packages local Maid = require(_Packages:WaitForChild("Maid")) local ColdFusion = require(_Packages:WaitForChild("ColdFusion")) -local Signal = require(_Packages:WaitForChild("Signal")) local MaterialIcons = require(_Packages:WaitForChild("MaterialIcons")) local TableUtil = require(_Packages:WaitForChild("TableUtil")) -- Modules -local Sounds = require(_Package:WaitForChild("Sounds")) -local Enums = require(_Package:WaitForChild("Enums")) local Types = require(_Package:WaitForChild("Types")) -local Config = require(_Package:WaitForChild("Config")) local Util = require(_Package:WaitForChild("Util")) local IconButton = require(_Package:WaitForChild("Component"):WaitForChild("Button"):WaitForChild("IconButton")) @@ -31,13 +25,12 @@ type ToggleTextStyle = Types.ToggleTextStyle type ImageData = Types.ImageData type ThemeData = Types.ThemeData type OptionData = Types.OptionData -type Signal = Signal.Signal type ButtonData = Types.ButtonData -- Constants local MAX_BUTTONS = 4 local ICONS = MaterialIcons.default.dp_48.scale_1 local ERROR_ICON = ICONS.error -local BUTTON_SEPARATION_DP = 4 +local BUTTON_SEPARATION_DP = 10 local BAR_TOP_BOTTOM_PADDING_DP = 6 local BAR_LEFT_RIGHT_PADDING_DP = 10 -- Variables diff --git a/src/Component/Bar/Top/Base.luau b/src/Component/Bar/Top/Base.luau new file mode 100644 index 00000000..9417b2f3 --- /dev/null +++ b/src/Component/Bar/Top/Base.luau @@ -0,0 +1,314 @@ +--!strict +local _Package = script.Parent.Parent.Parent.Parent +local _Packages = _Package.Parent +-- Services +-- Packages +local Maid = require(_Packages:WaitForChild("Maid")) +local ColdFusion = require(_Packages:WaitForChild("ColdFusion")) +local Signal = require(_Packages:WaitForChild("Signal")) +local MaterialIcons = require(_Packages:WaitForChild("MaterialIcons")) +local TableUtil = require(_Packages:WaitForChild("TableUtil")) + +-- Modules +local Types = require(_Package:WaitForChild("Types")) +local Util = require(_Package:WaitForChild("Util")) + +local IconButton = require(_Package:WaitForChild("Component"):WaitForChild("Button"):WaitForChild("IconButton")) + +-- Types +type Maid = Maid.Maid +type State = ColdFusion.State +type ValueState = ColdFusion.ValueState +type CanBeState = ColdFusion.CanBeState +type TextStyle = Types.TextStyle +type ToggleTextStyle = Types.ToggleTextStyle +type ImageData = Types.ImageData +type ThemeData = Types.ThemeData +type OptionData = Types.OptionData +type Signal = Signal.Signal +type ButtonData = Types.ButtonData +export type BarVariant = "Center" | "Small" | "Medium" | "Large" +-- Constants +local MAX_BUTTONS = 3 +local ICONS = MaterialIcons.default.dp_48.scale_1 +local ERROR_ICON = ICONS.error +local BUTTON_SEPARATION_DP = 10 +local BAR_TOP_BOTTOM_PADDING_DP = 12 +local BAR_LEFT_RIGHT_PADDING_DP = 10 +local LOWER_TEXT_MEDIUM_HEIGHT_DP = 36 +local LOWER_TEXT_LARGE_HEIGHT_DP = 48 +local LOWER_TEXT_MEDIUM_PADDING_DP = 18 +local LOWER_TEXT_LARGE_PADDING_DP = 24 +local UPPER_TEXT_HEIGHT_DP = 36 +-- Variables +-- References +-- Private Functions + +-- Class +local Interface = {} + +function Interface.cfusion( + title: CanBeState, + buttons: CanBeState<{ + [number]: ButtonData + }>, + navigationButton: CanBeState, + theme: CanBeState, + variant: CanBeState +): Frame + local maid = Maid.new() + + local _fuse = ColdFusion.fuse(maid) + + local _new = _fuse.new + local _bind = _fuse.bind + local _clone = _fuse.clone + local _import = _fuse.import + + local _Value = _fuse.Value + local _Computed = _fuse.Computed + + local buttonsState: State<{ + [number]: ButtonData + }> = _import(buttons, {}) + + local themeState: State = _import(theme, nil :: ThemeData?) + local elevatedThemeState = _Computed(function(th: ThemeData): ThemeData + local cth: ThemeData = TableUtil.deepCopy(th) + cth.Elevation += 1 + return cth + end, themeState) + local contrastThemeState = _Computed(function(th: ThemeData): ThemeData + local cth: ThemeData = TableUtil.deepCopy(th) + cth.Color3 = Util.getReadableColor(cth.Color3, Util.getElevatedColor(cth.BackgroundColor3 or cth.Color3, cth.Elevation, cth.IsDarkMode)) + return cth + end, themeState) + local elevatedContrastThemeState = _Computed(function(th: ThemeData): ThemeData + local cth: ThemeData = TableUtil.deepCopy(th) + cth.Color3 = Util.getReadableColor(cth.Color3, Util.getElevatedColor(cth.BackgroundColor3 or cth.Color3, cth.Elevation, cth.IsDarkMode)) + return cth + end, elevatedThemeState) + local scaleState: State = _Computed(function(th: ThemeData): number + return th.Scale + end, themeState) + local navState: State = _import(navigationButton, nil :: ButtonData?) + local variantState: State = _import(variant, "Center" :: BarVariant) + + local inst = _new("Frame")({ + AutomaticSize = Enum.AutomaticSize.XY, + BackgroundColor3 = _Computed(function(th: ThemeData): Color3 + return Util.getElevatedColor(th.BackgroundColor3 or th.Color3, th.Elevation, th.IsDarkMode) + end, themeState), + Children = { + _new("UIListLayout")({ + Padding = _Computed(function(s: number, var: BarVariant): UDim + if var == "Medium" then + return UDim.new(0, LOWER_TEXT_MEDIUM_PADDING_DP * s) + elseif var == "Large" then + return UDim.new(0, LOWER_TEXT_LARGE_PADDING_DP * s) + else + return UDim.new(0,0) + end + end, scaleState, variantState), + HorizontalFlex = Enum.UIFlexAlignment.Fill, + SortOrder = Enum.SortOrder.LayoutOrder, + FillDirection = Enum.FillDirection.Vertical, + ItemLineAlignment = Enum.ItemLineAlignment.Stretch, + VerticalAlignment = Enum.VerticalAlignment.Center, + HorizontalAlignment = Enum.HorizontalAlignment.Center, + }), + _new("UIPadding")({ + PaddingLeft = _Computed(function(s: number): UDim + return UDim.new(0, BAR_LEFT_RIGHT_PADDING_DP * s) + end, scaleState), + PaddingRight = _Computed(function(s: number): UDim + return UDim.new(0, BAR_LEFT_RIGHT_PADDING_DP * s) + end, scaleState), + PaddingTop = _Computed(function(s: number): UDim + return UDim.new(0, BAR_TOP_BOTTOM_PADDING_DP * s) + end, scaleState), + PaddingBottom = _Computed(function(s: number): UDim + return UDim.new(0, BAR_TOP_BOTTOM_PADDING_DP * s) + end, scaleState), + }), + _new("TextLabel")({ + Name = "LowerText", + Text = title, + TextXAlignment = Enum.TextXAlignment.Left, + AutomaticSize = Enum.AutomaticSize.X, + LayoutOrder = 2, + BackgroundTransparency = 1, + TextColor3 = _Computed(function(th: ThemeData): Color3 + return th.Color3 + end, contrastThemeState), + Visible = _Computed(function(var: BarVariant): boolean + return var == "Medium" or var == "Large" + end, variantState), + Size = _Computed(function(s: number, var: BarVariant): UDim2 + if var == "Medium" then + return UDim2.fromOffset(0, LOWER_TEXT_MEDIUM_HEIGHT_DP * s) + else + return UDim2.fromOffset(0, LOWER_TEXT_LARGE_HEIGHT_DP * s) + end + end, scaleState, variantState), + TextScaled = true, + FontFace = _Computed(function(th: ThemeData): Font + return th.Font + end, themeState), + }), + } + }) :: Frame + + local main = _new("Frame")({ + AutomaticSize = Enum.AutomaticSize.XY, + Parent = inst, + LayoutOrder = 1, + BackgroundTransparency = 1, + Children = { + _new("UIListLayout")({ + Padding = _Computed(function(s: number): UDim + return UDim.new(0, 0) + end, scaleState), + HorizontalFlex = _Computed(function(var: BarVariant): Enum.UIFlexAlignment + if var == "Center" then + return Enum.UIFlexAlignment.SpaceBetween + else + return Enum.UIFlexAlignment.Fill + end + end, variantState), + SortOrder = Enum.SortOrder.LayoutOrder, + FillDirection = Enum.FillDirection.Horizontal, + ItemLineAlignment = Enum.ItemLineAlignment.Center, + VerticalAlignment = Enum.VerticalAlignment.Center, + HorizontalAlignment = Enum.HorizontalAlignment.Center, + }), + _new("TextLabel")({ + Name = "MiddleText", + Text = title, + TextXAlignment = Enum.TextXAlignment.Center, + AutomaticSize = Enum.AutomaticSize.X, + LayoutOrder = 2, + BackgroundTransparency = 1, + Visible = _Computed(function(var: BarVariant): boolean + return var == "Center" + end, variantState), + TextColor3 = _Computed(function(th: ThemeData): Color3 + return th.Color3 + end, contrastThemeState), + Size = _Computed(function(s: number): UDim2 + return UDim2.fromOffset(0, UPPER_TEXT_HEIGHT_DP * s) + end, scaleState), + TextScaled = true, + FontFace = _Computed(function(th: ThemeData): Font + return th.Font + end, themeState), + }), + _new("Frame")({ + AutomaticSize = Enum.AutomaticSize.XY, + LayoutOrder = 1, + BackgroundTransparency = 1, + Children = { + _new("UIListLayout")({ + Padding = _Computed(function(s: number): UDim + return UDim.new(0, s * BUTTON_SEPARATION_DP) + end, scaleState), + SortOrder = Enum.SortOrder.LayoutOrder, + FillDirection = Enum.FillDirection.Horizontal, + ItemLineAlignment = Enum.ItemLineAlignment.Center, + VerticalAlignment = Enum.VerticalAlignment.Center, + HorizontalAlignment = Enum.HorizontalAlignment.Left, + }), + _new("TextLabel")({ + Name = "LeftText", + Text = title, + TextXAlignment = Enum.TextXAlignment.Center, + AutomaticSize = Enum.AutomaticSize.X, + LayoutOrder = 2, + BackgroundTransparency = 1, + Visible = _Computed(function(var: BarVariant): boolean + return var == "Small" + end, variantState), + TextColor3 = _Computed(function(th: ThemeData): Color3 + return th.Color3 + end, contrastThemeState), + Size = _Computed(function(s: number): UDim2 + return UDim2.fromOffset(0, UPPER_TEXT_HEIGHT_DP * s) + end, scaleState), + TextScaled = true, + FontFace = _Computed(function(th: ThemeData): Font + return th.Font + end, themeState), + }), + _bind(IconButton.cfusion( + _Computed(function(nData: ButtonData?) + return if nData then nData.OnClick else function() end + end, navState), + _Computed(function(nData: ButtonData?): ImageData + return if nData and nData.Icon then nData.Icon else ERROR_ICON + end, navState), + elevatedThemeState, + _Computed(function(nData: ButtonData?): boolean + return if nData then nData.Enabled else true + end, navState) + ))({ + Visible = _Computed(function(nData: ButtonData?): boolean + return nData ~= nil + end, navState), + Parent = inst, + LayoutOrder = 1, + }) + } + }) + } + }) + + local buttonContainer = _new("Frame")({ + AutomaticSize = Enum.AutomaticSize.XY, + Parent = main, + LayoutOrder = 3, + BackgroundTransparency = 1, + Children = { + _new("UIListLayout")({ + Padding = _Computed(function(s: number): UDim + return UDim.new(0, s * BUTTON_SEPARATION_DP) + end, scaleState), + SortOrder = Enum.SortOrder.LayoutOrder, + FillDirection = Enum.FillDirection.Horizontal, + ItemLineAlignment = Enum.ItemLineAlignment.Center, + VerticalAlignment = Enum.VerticalAlignment.Center, + HorizontalAlignment = Enum.HorizontalAlignment.Right, + }), + } + }) :: Frame + + for i=1, MAX_BUTTONS do + local buttonData = _Computed(function(bs: {[number]: ButtonData}): ButtonData? + return bs[i] + end, buttonsState) + + _bind(IconButton.cfusion( + _Computed(function(bData: ButtonData?) + return if bData then bData.OnClick else function() end + end, buttonData), + _Computed(function(bData: ButtonData?): ImageData + return if bData and bData.Icon then bData.Icon else ERROR_ICON + end, buttonData), + elevatedContrastThemeState, + _Computed(function(bData: ButtonData?): boolean + return if bData then bData.Enabled else true + end, buttonData) + ))({ + LayoutOrder = i, + Visible = _Computed(function(bData: ButtonData?): boolean + return bData ~= nil + end, buttonData), + Parent = buttonContainer, + }) + + end + + return inst + +end + +return Interface diff --git a/src/Component/Bar/Top/Center/cfusion.story.luau b/src/Component/Bar/Top/Center/cfusion.story.luau new file mode 100644 index 00000000..ca215ceb --- /dev/null +++ b/src/Component/Bar/Top/Center/cfusion.story.luau @@ -0,0 +1,87 @@ +--!strict +local _Package = script.Parent.Parent.Parent.Parent.Parent +local _Packages = _Package.Parent +-- Services +-- Packages +local Maid = require(_Packages:WaitForChild("Maid")) +local MaterialIcons = require(_Packages:WaitForChild("MaterialIcons")) + +-- Modules +local Types = require(_Package:WaitForChild("Types")) + +-- Types +-- Constants +local SCALE = 1 +-- Variables +-- References +local Icons = MaterialIcons.default.dp_48.scale_1 + +-- Class +return function(frame: Frame) + local maid = Maid.new() + task.spawn(function() + local Module = require(script.Parent) + + local listLayout = maid:GiveTask(Instance.new("UIListLayout")) + listLayout.FillDirection = Enum.FillDirection.Vertical + listLayout.Padding = UDim.new(0, 10) + listLayout.VerticalAlignment = Enum.VerticalAlignment.Center + listLayout.HorizontalAlignment = Enum.HorizontalAlignment.Center + listLayout.Parent = frame + + local function build(isDarkMode: boolean, color: Color3) + local selectionColor = nil --Color3.new(1,0.75,0) + -- local frameColor = Color3.new(0, 0, 0) + + local theme = Types.newThemeData( + 0, + isDarkMode, + SCALE, + Font.fromEnum(Enum.Font.SourceSans), + color, + nil, --frameColor, + selectionColor + ) + + local out = maid:GiveTask(Module.cfusion( + "Title", + { + Types.newButtonData( + function() + print("save click") + end, + Icons.save + ), + Types.newButtonData( + function() + print("publish click") + end, + Icons.publish + ), + }, + Types.newButtonData( + function() + print("nav click") + end, + Icons.arrow_back + ), + theme + )) + + out.Position = UDim2.fromScale(0.5, 0.5) + out.AnchorPoint = Vector2.new(0.5, 0.5) + out.Size= UDim2.fromScale(1,0) + out.Parent = frame + + end + build(false, Color3.fromHSV(0.5, 0.3, 0.95)) + build(true, Color3.fromHSV(0.5, 0.5, 0.4)) + build(false, Color3.fromHSV(0.1, 0.3, 0.95)) + build(true, Color3.fromHSV(0.1, 0.5, 0.4)) + build(false, Color3.fromHSV(0.7, 0.3, 0.95)) + build(true, Color3.fromHSV(0.7, 0.5, 0.4)) + end) + return function() + maid:Destroy() + end +end diff --git a/src/Component/Bar/Top/Center/init.luau b/src/Component/Bar/Top/Center/init.luau new file mode 100644 index 00000000..689751ff --- /dev/null +++ b/src/Component/Bar/Top/Center/init.luau @@ -0,0 +1,51 @@ +--!strict +local _Package = script.Parent.Parent.Parent.Parent +local _Packages = _Package.Parent +-- Services + +-- Packages +local Maid = require(_Packages:WaitForChild("Maid")) +local ColdFusion = require(_Packages:WaitForChild("ColdFusion")) + +-- Modules +local Types = require(_Package:WaitForChild("Types")) +local TopBase = require(script.Parent:WaitForChild("Base")) + +-- Types +type Maid = Maid.Maid +type State = ColdFusion.State +type ValueState = ColdFusion.ValueState +type CanBeState = ColdFusion.CanBeState +type TextStyle = Types.TextStyle +type ToggleTextStyle = Types.ToggleTextStyle +type ImageData = Types.ImageData +type ThemeData = Types.ThemeData +type OptionData = Types.OptionData +type ButtonData = Types.ButtonData +-- Constants +-- Variables +-- References +-- Private Functions + +-- Class +local Interface = {} + +function Interface.cfusion( + title: CanBeState, + buttons: CanBeState<{ + [number]: ButtonData + }>, + fab: CanBeState, + theme: CanBeState +): Frame + + return TopBase.cfusion( + title, + buttons, + fab, + theme, + "Center" + ) +end + +return Interface diff --git a/src/Component/Bar/Top/Large/cfusion.story.luau b/src/Component/Bar/Top/Large/cfusion.story.luau new file mode 100644 index 00000000..ca215ceb --- /dev/null +++ b/src/Component/Bar/Top/Large/cfusion.story.luau @@ -0,0 +1,87 @@ +--!strict +local _Package = script.Parent.Parent.Parent.Parent.Parent +local _Packages = _Package.Parent +-- Services +-- Packages +local Maid = require(_Packages:WaitForChild("Maid")) +local MaterialIcons = require(_Packages:WaitForChild("MaterialIcons")) + +-- Modules +local Types = require(_Package:WaitForChild("Types")) + +-- Types +-- Constants +local SCALE = 1 +-- Variables +-- References +local Icons = MaterialIcons.default.dp_48.scale_1 + +-- Class +return function(frame: Frame) + local maid = Maid.new() + task.spawn(function() + local Module = require(script.Parent) + + local listLayout = maid:GiveTask(Instance.new("UIListLayout")) + listLayout.FillDirection = Enum.FillDirection.Vertical + listLayout.Padding = UDim.new(0, 10) + listLayout.VerticalAlignment = Enum.VerticalAlignment.Center + listLayout.HorizontalAlignment = Enum.HorizontalAlignment.Center + listLayout.Parent = frame + + local function build(isDarkMode: boolean, color: Color3) + local selectionColor = nil --Color3.new(1,0.75,0) + -- local frameColor = Color3.new(0, 0, 0) + + local theme = Types.newThemeData( + 0, + isDarkMode, + SCALE, + Font.fromEnum(Enum.Font.SourceSans), + color, + nil, --frameColor, + selectionColor + ) + + local out = maid:GiveTask(Module.cfusion( + "Title", + { + Types.newButtonData( + function() + print("save click") + end, + Icons.save + ), + Types.newButtonData( + function() + print("publish click") + end, + Icons.publish + ), + }, + Types.newButtonData( + function() + print("nav click") + end, + Icons.arrow_back + ), + theme + )) + + out.Position = UDim2.fromScale(0.5, 0.5) + out.AnchorPoint = Vector2.new(0.5, 0.5) + out.Size= UDim2.fromScale(1,0) + out.Parent = frame + + end + build(false, Color3.fromHSV(0.5, 0.3, 0.95)) + build(true, Color3.fromHSV(0.5, 0.5, 0.4)) + build(false, Color3.fromHSV(0.1, 0.3, 0.95)) + build(true, Color3.fromHSV(0.1, 0.5, 0.4)) + build(false, Color3.fromHSV(0.7, 0.3, 0.95)) + build(true, Color3.fromHSV(0.7, 0.5, 0.4)) + end) + return function() + maid:Destroy() + end +end diff --git a/src/Component/Bar/Top/Large/init.luau b/src/Component/Bar/Top/Large/init.luau new file mode 100644 index 00000000..9b0b5111 --- /dev/null +++ b/src/Component/Bar/Top/Large/init.luau @@ -0,0 +1,51 @@ +--!strict +local _Package = script.Parent.Parent.Parent.Parent +local _Packages = _Package.Parent +-- Services + +-- Packages +local Maid = require(_Packages:WaitForChild("Maid")) +local ColdFusion = require(_Packages:WaitForChild("ColdFusion")) + +-- Modules +local Types = require(_Package:WaitForChild("Types")) +local TopBase = require(script.Parent:WaitForChild("Base")) + +-- Types +type Maid = Maid.Maid +type State = ColdFusion.State +type ValueState = ColdFusion.ValueState +type CanBeState = ColdFusion.CanBeState +type TextStyle = Types.TextStyle +type ToggleTextStyle = Types.ToggleTextStyle +type ImageData = Types.ImageData +type ThemeData = Types.ThemeData +type OptionData = Types.OptionData +type ButtonData = Types.ButtonData +-- Constants +-- Variables +-- References +-- Private Functions + +-- Class +local Interface = {} + +function Interface.cfusion( + title: CanBeState, + buttons: CanBeState<{ + [number]: ButtonData + }>, + fab: CanBeState, + theme: CanBeState +): Frame + + return TopBase.cfusion( + title, + buttons, + fab, + theme, + "Large" + ) +end + +return Interface diff --git a/src/Component/Bar/Top/Medium/cfusion.story.luau b/src/Component/Bar/Top/Medium/cfusion.story.luau new file mode 100644 index 00000000..ca215ceb --- /dev/null +++ b/src/Component/Bar/Top/Medium/cfusion.story.luau @@ -0,0 +1,87 @@ +--!strict +local _Package = script.Parent.Parent.Parent.Parent.Parent +local _Packages = _Package.Parent +-- Services +-- Packages +local Maid = require(_Packages:WaitForChild("Maid")) +local MaterialIcons = require(_Packages:WaitForChild("MaterialIcons")) + +-- Modules +local Types = require(_Package:WaitForChild("Types")) + +-- Types +-- Constants +local SCALE = 1 +-- Variables +-- References +local Icons = MaterialIcons.default.dp_48.scale_1 + +-- Class +return function(frame: Frame) + local maid = Maid.new() + task.spawn(function() + local Module = require(script.Parent) + + local listLayout = maid:GiveTask(Instance.new("UIListLayout")) + listLayout.FillDirection = Enum.FillDirection.Vertical + listLayout.Padding = UDim.new(0, 10) + listLayout.VerticalAlignment = Enum.VerticalAlignment.Center + listLayout.HorizontalAlignment = Enum.HorizontalAlignment.Center + listLayout.Parent = frame + + local function build(isDarkMode: boolean, color: Color3) + local selectionColor = nil --Color3.new(1,0.75,0) + -- local frameColor = Color3.new(0, 0, 0) + + local theme = Types.newThemeData( + 0, + isDarkMode, + SCALE, + Font.fromEnum(Enum.Font.SourceSans), + color, + nil, --frameColor, + selectionColor + ) + + local out = maid:GiveTask(Module.cfusion( + "Title", + { + Types.newButtonData( + function() + print("save click") + end, + Icons.save + ), + Types.newButtonData( + function() + print("publish click") + end, + Icons.publish + ), + }, + Types.newButtonData( + function() + print("nav click") + end, + Icons.arrow_back + ), + theme + )) + + out.Position = UDim2.fromScale(0.5, 0.5) + out.AnchorPoint = Vector2.new(0.5, 0.5) + out.Size= UDim2.fromScale(1,0) + out.Parent = frame + + end + build(false, Color3.fromHSV(0.5, 0.3, 0.95)) + build(true, Color3.fromHSV(0.5, 0.5, 0.4)) + build(false, Color3.fromHSV(0.1, 0.3, 0.95)) + build(true, Color3.fromHSV(0.1, 0.5, 0.4)) + build(false, Color3.fromHSV(0.7, 0.3, 0.95)) + build(true, Color3.fromHSV(0.7, 0.5, 0.4)) + end) + return function() + maid:Destroy() + end +end diff --git a/src/Component/Bar/Top/Medium/init.luau b/src/Component/Bar/Top/Medium/init.luau new file mode 100644 index 00000000..810ccbb0 --- /dev/null +++ b/src/Component/Bar/Top/Medium/init.luau @@ -0,0 +1,51 @@ +--!strict +local _Package = script.Parent.Parent.Parent.Parent +local _Packages = _Package.Parent +-- Services + +-- Packages +local Maid = require(_Packages:WaitForChild("Maid")) +local ColdFusion = require(_Packages:WaitForChild("ColdFusion")) + +-- Modules +local Types = require(_Package:WaitForChild("Types")) +local TopBase = require(script.Parent:WaitForChild("Base")) + +-- Types +type Maid = Maid.Maid +type State = ColdFusion.State +type ValueState = ColdFusion.ValueState +type CanBeState = ColdFusion.CanBeState +type TextStyle = Types.TextStyle +type ToggleTextStyle = Types.ToggleTextStyle +type ImageData = Types.ImageData +type ThemeData = Types.ThemeData +type OptionData = Types.OptionData +type ButtonData = Types.ButtonData +-- Constants +-- Variables +-- References +-- Private Functions + +-- Class +local Interface = {} + +function Interface.cfusion( + title: CanBeState, + buttons: CanBeState<{ + [number]: ButtonData + }>, + fab: CanBeState, + theme: CanBeState +): Frame + + return TopBase.cfusion( + title, + buttons, + fab, + theme, + "Medium" + ) +end + +return Interface diff --git a/src/Component/Bar/Top/Small/cfusion.story.luau b/src/Component/Bar/Top/Small/cfusion.story.luau new file mode 100644 index 00000000..ca215ceb --- /dev/null +++ b/src/Component/Bar/Top/Small/cfusion.story.luau @@ -0,0 +1,87 @@ +--!strict +local _Package = script.Parent.Parent.Parent.Parent.Parent +local _Packages = _Package.Parent +-- Services +-- Packages +local Maid = require(_Packages:WaitForChild("Maid")) +local MaterialIcons = require(_Packages:WaitForChild("MaterialIcons")) + +-- Modules +local Types = require(_Package:WaitForChild("Types")) + +-- Types +-- Constants +local SCALE = 1 +-- Variables +-- References +local Icons = MaterialIcons.default.dp_48.scale_1 + +-- Class +return function(frame: Frame) + local maid = Maid.new() + task.spawn(function() + local Module = require(script.Parent) + + local listLayout = maid:GiveTask(Instance.new("UIListLayout")) + listLayout.FillDirection = Enum.FillDirection.Vertical + listLayout.Padding = UDim.new(0, 10) + listLayout.VerticalAlignment = Enum.VerticalAlignment.Center + listLayout.HorizontalAlignment = Enum.HorizontalAlignment.Center + listLayout.Parent = frame + + local function build(isDarkMode: boolean, color: Color3) + local selectionColor = nil --Color3.new(1,0.75,0) + -- local frameColor = Color3.new(0, 0, 0) + + local theme = Types.newThemeData( + 0, + isDarkMode, + SCALE, + Font.fromEnum(Enum.Font.SourceSans), + color, + nil, --frameColor, + selectionColor + ) + + local out = maid:GiveTask(Module.cfusion( + "Title", + { + Types.newButtonData( + function() + print("save click") + end, + Icons.save + ), + Types.newButtonData( + function() + print("publish click") + end, + Icons.publish + ), + }, + Types.newButtonData( + function() + print("nav click") + end, + Icons.arrow_back + ), + theme + )) + + out.Position = UDim2.fromScale(0.5, 0.5) + out.AnchorPoint = Vector2.new(0.5, 0.5) + out.Size= UDim2.fromScale(1,0) + out.Parent = frame + + end + build(false, Color3.fromHSV(0.5, 0.3, 0.95)) + build(true, Color3.fromHSV(0.5, 0.5, 0.4)) + build(false, Color3.fromHSV(0.1, 0.3, 0.95)) + build(true, Color3.fromHSV(0.1, 0.5, 0.4)) + build(false, Color3.fromHSV(0.7, 0.3, 0.95)) + build(true, Color3.fromHSV(0.7, 0.5, 0.4)) + end) + return function() + maid:Destroy() + end +end diff --git a/src/Component/Bar/Top/Small/init.luau b/src/Component/Bar/Top/Small/init.luau new file mode 100644 index 00000000..c0c73183 --- /dev/null +++ b/src/Component/Bar/Top/Small/init.luau @@ -0,0 +1,51 @@ +--!strict +local _Package = script.Parent.Parent.Parent.Parent +local _Packages = _Package.Parent +-- Services + +-- Packages +local Maid = require(_Packages:WaitForChild("Maid")) +local ColdFusion = require(_Packages:WaitForChild("ColdFusion")) + +-- Modules +local Types = require(_Package:WaitForChild("Types")) +local TopBase = require(script.Parent:WaitForChild("Base")) + +-- Types +type Maid = Maid.Maid +type State = ColdFusion.State +type ValueState = ColdFusion.ValueState +type CanBeState = ColdFusion.CanBeState +type TextStyle = Types.TextStyle +type ToggleTextStyle = Types.ToggleTextStyle +type ImageData = Types.ImageData +type ThemeData = Types.ThemeData +type OptionData = Types.OptionData +type ButtonData = Types.ButtonData +-- Constants +-- Variables +-- References +-- Private Functions + +-- Class +local Interface = {} + +function Interface.cfusion( + title: CanBeState, + buttons: CanBeState<{ + [number]: ButtonData + }>, + fab: CanBeState, + theme: CanBeState +): Frame + + return TopBase.cfusion( + title, + buttons, + fab, + theme, + "Small" + ) +end + +return Interface From bca642607d89f4583af5e3f7afdd47d1df6ecbd2 Mon Sep 17 00:00:00 2001 From: Nightcycle <77173389+nightcycle@users.noreply.github.com> Date: Thu, 7 Dec 2023 16:13:01 -0500 Subject: [PATCH 18/57] Progress translating material-color-util --- sourcemap.json | 2 +- src/Color/Blend.luau | 48 ++ src/Color/ColorUtils.luau | 1 + src/Color/HCT/Cam16.luau | 333 +++++++++++++ src/Color/HCT/Solver.luau | 580 ++++++++++++++++++++++ src/Color/HCT/init.luau | 122 +++++ src/Color/MathUtils.luau | 1 + src/Color/Palettes/Core.luau | 1 + src/Color/Palettes/Tonal.luau | 1 + src/Color/Scheme/init.luau | 1 + src/Color/ViewingConditions.luau | 1 + src/Color/init.luau | 101 ++++ src/Component/Bar/Top/Center/init.luau | 3 - src/Component/Button/Base.luau | 54 +- src/Component/Button/TextButton/init.luau | 19 +- src/Types.luau | 107 ++-- src/init.luau | 3 - stylua.toml | 2 +- 18 files changed, 1258 insertions(+), 122 deletions(-) create mode 100644 src/Color/Blend.luau create mode 100644 src/Color/ColorUtils.luau create mode 100644 src/Color/HCT/Cam16.luau create mode 100644 src/Color/HCT/Solver.luau create mode 100644 src/Color/HCT/init.luau create mode 100644 src/Color/MathUtils.luau create mode 100644 src/Color/Palettes/Core.luau create mode 100644 src/Color/Palettes/Tonal.luau create mode 100644 src/Color/Scheme/init.luau create mode 100644 src/Color/ViewingConditions.luau create mode 100644 src/Color/init.luau diff --git a/sourcemap.json b/sourcemap.json index 5c28f812..0aa4ebba 100644 --- a/sourcemap.json +++ b/sourcemap.json @@ -1 +1 @@ -{"name":"synthetic-test","className":"DataModel","filePaths":["dev.project.json"],"children":[{"name":"ReplicatedStorage","className":"ReplicatedStorage","children":[{"name":"Packages","className":"Folder","children":[{"name":"ColdFusion","className":"ModuleScript","filePaths":["Packages\\ColdFusion.lua"]},{"name":"CurveUtil","className":"ModuleScript","filePaths":["Packages\\CurveUtil.lua"]},{"name":"Format","className":"ModuleScript","filePaths":["Packages\\Format.lua"]},{"name":"Fusion","className":"ModuleScript","filePaths":["Packages\\Fusion.lua"]},{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\Maid.lua"]},{"name":"MaterialIcons","className":"ModuleScript","filePaths":["Packages\\MaterialIcons.lua"]},{"name":"MeshUtil","className":"ModuleScript","filePaths":["Packages\\MeshUtil.lua"]},{"name":"Roact","className":"ModuleScript","filePaths":["Packages\\Roact.lua"]},{"name":"Signal","className":"ModuleScript","filePaths":["Packages\\Signal.lua"]},{"name":"TableUtil","className":"ModuleScript","filePaths":["Packages\\TableUtil.lua"]},{"name":"_Index","className":"Folder","children":[{"name":"elttob_fusion@0.2.0","className":"Folder","children":[{"name":"fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\init.lua","Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\default.project.json"],"children":[{"name":"Animation","className":"Folder","children":[{"name":"Spring","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\Spring.lua"]},{"name":"SpringScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\SpringScheduler.lua"]},{"name":"Tween","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\Tween.lua"]},{"name":"TweenScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\TweenScheduler.lua"]},{"name":"getTweenRatio","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\getTweenRatio.lua"]},{"name":"lerpType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\lerpType.lua"]},{"name":"packType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\packType.lua"]},{"name":"springCoefficients","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\springCoefficients.lua"]},{"name":"unpackType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\unpackType.lua"]}]},{"name":"Colour","className":"Folder","children":[{"name":"Oklab","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Colour\\Oklab.lua"]}]},{"name":"Dependencies","className":"Folder","children":[{"name":"captureDependencies","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\captureDependencies.lua"]},{"name":"initDependency","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\initDependency.lua"]},{"name":"sharedState","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\sharedState.lua"]},{"name":"updateAll","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\updateAll.lua"]},{"name":"useDependency","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\useDependency.lua"]}]},{"name":"Instances","className":"Folder","children":[{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Children.lua"]},{"name":"Cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Cleanup.lua"]},{"name":"Hydrate","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Hydrate.lua"]},{"name":"New","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\New.lua"]},{"name":"OnChange","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\OnChange.lua"]},{"name":"OnEvent","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\OnEvent.lua"]},{"name":"Out","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Out.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Ref.lua"]},{"name":"applyInstanceProps","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\applyInstanceProps.lua"]},{"name":"defaultProps","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\defaultProps.lua"]}]},{"name":"Logging","className":"Folder","children":[{"name":"logError","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logError.lua"]},{"name":"logErrorNonFatal","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logErrorNonFatal.lua"]},{"name":"logWarn","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logWarn.lua"]},{"name":"messages","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\messages.lua"]},{"name":"parseError","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\parseError.lua"]}]},{"name":"PubTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\PubTypes.lua"]},{"name":"State","className":"Folder","children":[{"name":"Computed","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Computed.lua"]},{"name":"ForKeys","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForKeys.lua"]},{"name":"ForPairs","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForPairs.lua"]},{"name":"ForValues","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForValues.lua"]},{"name":"Observer","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Observer.lua"]},{"name":"Value","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Value.lua"]},{"name":"unwrap","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\unwrap.lua"]}]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Types.lua"]},{"name":"Utility","className":"Folder","children":[{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\None.lua"]},{"name":"cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\cleanup.lua"]},{"name":"doNothing","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\doNothing.lua"]},{"name":"isSimilar","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\isSimilar.lua"]},{"name":"needsDestruction","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\needsDestruction.lua"]},{"name":"restrictRead","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\restrictRead.lua"]},{"name":"xtypeof","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\xtypeof.lua"]}]}]}]},{"name":"nightcycle_cold-fusion@9.0.7","className":"Folder","children":[{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\Maid.lua"]},{"name":"ServiceProxy","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\ServiceProxy.lua"]},{"name":"Signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\Signal.lua"]},{"name":"TableUtil","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\TableUtil.lua"]},{"name":"cold-fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\init.luau","Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\default.project.json"],"children":[{"name":"Fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\init.lua"],"children":[{"name":"Animation","className":"Folder","children":[{"name":"Spring","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\Spring.lua"]},{"name":"SpringScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\SpringScheduler.lua"]},{"name":"Tween","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\Tween.lua"]},{"name":"TweenScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\TweenScheduler.lua"]},{"name":"getTweenRatio","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\getTweenRatio.lua"]},{"name":"lerpType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\lerpType.lua"]},{"name":"packType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\packType.lua"]},{"name":"springCoefficients","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\springCoefficients.lua"]},{"name":"unpackType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\unpackType.lua"]}]},{"name":"Colour","className":"Folder","children":[{"name":"Oklab","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Colour\\Oklab.lua"]}]},{"name":"Instances","className":"Folder","children":[{"name":"Attribute","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Attribute.lua"]},{"name":"AttributeChange","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\AttributeChange.lua"]},{"name":"AttributeOut","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\AttributeOut.lua"]},{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Children.lua"]},{"name":"Cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Cleanup.lua"]},{"name":"Hydrate","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Hydrate.lua"]},{"name":"New","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\New.lua"]},{"name":"OnChange","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\OnChange.lua"]},{"name":"OnEvent","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\OnEvent.lua"]},{"name":"Out","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Out.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Ref.lua"]},{"name":"applyInstanceProps","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\applyInstanceProps.lua"]},{"name":"defaultProps","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\defaultProps.lua"]}]},{"name":"Logging","className":"Folder","children":[{"name":"logError","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logError.lua"]},{"name":"logErrorNonFatal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logErrorNonFatal.lua"]},{"name":"logWarn","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logWarn.lua"]},{"name":"messages","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\messages.lua"]},{"name":"parseError","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\parseError.lua"]}]},{"name":"PubTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\PubTypes.lua"]},{"name":"State","className":"Folder","children":[{"name":"Computed","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Computed.lua"]},{"name":"ForKeys","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForKeys.lua"]},{"name":"ForPairs","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForPairs.lua"]},{"name":"ForValues","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForValues.lua"]},{"name":"Observer","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Observer.lua"]},{"name":"Value","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Value.lua"]},{"name":"isState","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\isState.lua"]},{"name":"makeUseCallback","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\makeUseCallback.lua"]},{"name":"peek","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\peek.lua"]},{"name":"updateAll","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\updateAll.lua"]}]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Types.lua"]},{"name":"Utility","className":"Folder","children":[{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\None.lua"]},{"name":"cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\cleanup.lua"]},{"name":"doNothing","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\doNothing.lua"]},{"name":"isSimilar","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\isSimilar.lua"]},{"name":"needsDestruction","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\needsDestruction.lua"]},{"name":"restrictRead","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\restrictRead.lua"]},{"name":"xtypeof","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\xtypeof.lua"]}]}]},{"name":"InstanceTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\InstanceTypes.luau"]},{"name":"Interface","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Interface.luau"]},{"name":"Test.story","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Test.story.luau"]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Types.luau"]},{"name":"Util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Util.luau"]}]}]},{"name":"nightcycle_curve-util@1.0.0","className":"Folder","children":[{"name":"Vector","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\Vector.lua"]},{"name":"curve-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\init.lua","Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\default.project.json"],"children":[{"name":"Ease","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\Ease.lua"]},{"name":"Lerp","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\Lerp.lua"]}]}]},{"name":"nightcycle_format@0.1.3","className":"Folder","children":[{"name":"format","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\init.lua","Packages\\_Index\\nightcycle_format@0.1.3\\format\\default.project.json"],"children":[{"name":"Emoji","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\Emoji.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\init.spec.lua"]}]},{"name":"maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\maid.lua"]},{"name":"signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\signal.lua"]},{"name":"string","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\string.lua"]}]},{"name":"nightcycle_geometry-util@1.1.1","className":"Folder","children":[{"name":"geometry-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\init.lua","Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\default.project.json"],"children":[{"name":"Earcut","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\Earcut\\init.lua"],"children":[{"name":"ZeroArray","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\Earcut\\ZeroArray.lua"]}]}]}]},{"name":"nightcycle_maid@1.1.4","className":"Folder","children":[{"name":"maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\init.lua","Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\default.project.json"],"children":[{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\Maid.lua"]},{"name":"MaidTaskUtils","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\MaidTaskUtils.lua"]}]}]},{"name":"nightcycle_material-icons@1.0.1","className":"Folder","children":[{"name":"material-icons","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\init.luau","Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\default.project.json"],"children":[{"name":"Default_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_1.luau"]},{"name":"Default_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_2.luau"]},{"name":"Default_18_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_3.luau"]},{"name":"Default_18_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_4.luau"]},{"name":"Default_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_1.luau"]},{"name":"Default_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_2.luau"]},{"name":"Default_24_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_3.luau"]},{"name":"Default_24_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_4.luau"]},{"name":"Default_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_1.luau"]},{"name":"Default_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_2.luau"]},{"name":"Default_36_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_3.luau"]},{"name":"Default_36_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_4.luau"]},{"name":"Default_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_1.luau"]},{"name":"Default_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_2.luau"]},{"name":"Default_48_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_3.luau"]},{"name":"Default_48_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_4.luau"]},{"name":"Outlined_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_18_1.luau"]},{"name":"Outlined_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_18_2.luau"]},{"name":"Outlined_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_24_1.luau"]},{"name":"Outlined_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_24_2.luau"]},{"name":"Outlined_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_36_1.luau"]},{"name":"Outlined_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_36_2.luau"]},{"name":"Outlined_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_48_1.luau"]},{"name":"Outlined_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_48_2.luau"]},{"name":"Round_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_18_1.luau"]},{"name":"Round_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_18_2.luau"]},{"name":"Round_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_24_1.luau"]},{"name":"Round_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_24_2.luau"]},{"name":"Round_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_36_1.luau"]},{"name":"Round_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_36_2.luau"]},{"name":"Round_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_48_1.luau"]},{"name":"Round_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_48_2.luau"]},{"name":"Sharp_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_18_1.luau"]},{"name":"Sharp_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_18_2.luau"]},{"name":"Sharp_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_24_1.luau"]},{"name":"Sharp_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_24_2.luau"]},{"name":"Sharp_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_36_1.luau"]},{"name":"Sharp_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_36_2.luau"]},{"name":"Sharp_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_48_1.luau"]},{"name":"Sharp_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_48_2.luau"]},{"name":"TwoTone_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_18_1.luau"]},{"name":"TwoTone_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_18_2.luau"]},{"name":"TwoTone_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_24_1.luau"]},{"name":"TwoTone_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_24_2.luau"]},{"name":"TwoTone_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_36_1.luau"]},{"name":"TwoTone_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_36_2.luau"]},{"name":"TwoTone_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_48_1.luau"]},{"name":"TwoTone_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_48_2.luau"]}]}]},{"name":"nightcycle_mesh-util@1.0.3","className":"Folder","children":[{"name":"GeometryUtil","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\GeometryUtil.lua"]},{"name":"mesh-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\init.lua","Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\default.project.json"],"children":[{"name":"CornerWedgePart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\CornerWedgePart.lua"]},{"name":"Part","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\Part.lua"]},{"name":"TetraPart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\TetraPart.lua"]},{"name":"WedgePart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\WedgePart.lua"]}]}]},{"name":"nightcycle_service-proxy@1.0.0","className":"Folder","children":[{"name":"service-proxy","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_service-proxy@1.0.0\\service-proxy\\src\\init.lua","Packages\\_Index\\nightcycle_service-proxy@1.0.0\\service-proxy\\default.project.json"]}]},{"name":"nightcycle_signal@1.0.2","className":"Folder","children":[{"name":"signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_signal@1.0.2\\signal\\src\\init.lua","Packages\\_Index\\nightcycle_signal@1.0.2\\signal\\default.project.json"]}]},{"name":"nightcycle_string@0.1.0","className":"Folder","children":[{"name":"string","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_string@0.1.0\\string\\src\\init.lua","Packages\\_Index\\nightcycle_string@0.1.0\\string\\default.project.json"],"children":[{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_string@0.1.0\\string\\src\\init.spec.lua"]}]}]},{"name":"nightcycle_table-util@1.1.0","className":"Folder","children":[{"name":"table-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_table-util@1.1.0\\table-util\\src\\init.lua","Packages\\_Index\\nightcycle_table-util@1.1.0\\table-util\\default.project.json"]}]},{"name":"nightcycle_vector@1.0.2","className":"Folder","children":[{"name":"vector","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_vector@1.0.2\\vector\\src\\init.lua","Packages\\_Index\\nightcycle_vector@1.0.2\\vector\\default.project.json"]}]},{"name":"roblox_roact@1.4.4","className":"Folder","children":[{"name":"roact","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\init.lua","Packages\\_Index\\roblox_roact@1.4.4\\roact\\default.project.json"],"children":[{"name":"Binding","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Binding.lua"]},{"name":"Binding.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Binding.spec.lua"]},{"name":"Component","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.lua"]},{"name":"Component.spec","className":"Folder","children":[{"name":"context.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\context.spec.lua"]},{"name":"defaultProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\defaultProps.spec.lua"]},{"name":"didMount.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\didMount.spec.lua"]},{"name":"didUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\didUpdate.spec.lua"]},{"name":"extend.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\extend.spec.lua"]},{"name":"getDerivedStateFromProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\getDerivedStateFromProps.spec.lua"]},{"name":"getElementTraceback.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\getElementTraceback.spec.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\init.spec.lua"]},{"name":"legacyContext.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\legacyContext.spec.lua"]},{"name":"render.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\render.spec.lua"]},{"name":"setState.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\setState.spec.lua"]},{"name":"shouldUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\shouldUpdate.spec.lua"]},{"name":"validateProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\validateProps.spec.lua"]},{"name":"willUnmount.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\willUnmount.spec.lua"]},{"name":"willUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\willUpdate.spec.lua"]}]},{"name":"ComponentLifecyclePhase","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ComponentLifecyclePhase.lua"]},{"name":"Config","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Config.lua"]},{"name":"Config.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Config.spec.lua"]},{"name":"ElementKind","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementKind.lua"]},{"name":"ElementKind.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementKind.spec.lua"]},{"name":"ElementUtils","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementUtils.lua"]},{"name":"ElementUtils.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementUtils.spec.lua"]},{"name":"GlobalConfig","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\GlobalConfig.lua"]},{"name":"GlobalConfig.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\GlobalConfig.spec.lua"]},{"name":"Logging","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Logging.lua"]},{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\None.lua"]},{"name":"NoopRenderer","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\NoopRenderer.lua"]},{"name":"Portal","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Portal.lua"]},{"name":"PropMarkers","className":"Folder","children":[{"name":"Change","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Change.lua"]},{"name":"Change.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Change.spec.lua"]},{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Children.lua"]},{"name":"Event","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Event.lua"]},{"name":"Event.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Event.spec.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Ref.lua"]}]},{"name":"PureComponent","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PureComponent.lua"]},{"name":"PureComponent.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PureComponent.spec.lua"]},{"name":"RobloxRenderer","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\RobloxRenderer.lua"]},{"name":"RobloxRenderer.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\RobloxRenderer.spec.lua"]},{"name":"SingleEventManager","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\SingleEventManager.lua"]},{"name":"SingleEventManager.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\SingleEventManager.spec.lua"]},{"name":"Symbol","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Symbol.lua"]},{"name":"Symbol.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Symbol.spec.lua"]},{"name":"Type","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Type.lua"]},{"name":"Type.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Type.spec.lua"]},{"name":"assertDeepEqual","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assertDeepEqual.lua"]},{"name":"assertDeepEqual.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assertDeepEqual.spec.lua"]},{"name":"assign","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assign.lua"]},{"name":"assign.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assign.spec.lua"]},{"name":"createContext","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createContext.lua"]},{"name":"createContext.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createContext.spec.lua"]},{"name":"createElement","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createElement.lua"]},{"name":"createElement.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createElement.spec.lua"]},{"name":"createFragment","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createFragment.lua"]},{"name":"createFragment.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createFragment.spec.lua"]},{"name":"createReconciler","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconciler.lua"]},{"name":"createReconciler.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconciler.spec.lua"]},{"name":"createReconcilerCompat","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconcilerCompat.lua"]},{"name":"createReconcilerCompat.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconcilerCompat.spec.lua"]},{"name":"createRef","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createRef.lua"]},{"name":"createRef.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createRef.spec.lua"]},{"name":"createSignal","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSignal.lua"]},{"name":"createSignal.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSignal.spec.lua"]},{"name":"createSpy","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSpy.lua"]},{"name":"createSpy.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSpy.spec.lua"]},{"name":"forwardRef","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\forwardRef.lua"]},{"name":"forwardRef.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\forwardRef.spec.lua"]},{"name":"getDefaultInstanceProperty","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\getDefaultInstanceProperty.lua"]},{"name":"getDefaultInstanceProperty.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\getDefaultInstanceProperty.spec.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\init.spec.lua"]},{"name":"internalAssert","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\internalAssert.lua"]},{"name":"invalidSetStateMessages","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\invalidSetStateMessages.lua"]},{"name":"oneChild","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\oneChild.lua"]},{"name":"oneChild.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\oneChild.spec.lua"]},{"name":"strict","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\strict.lua"]},{"name":"strict.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\strict.spec.lua"]}]}]}]},{"name":"synthetic","className":"ModuleScript","filePaths":["src\\init.luau"],"children":[{"name":"Component","className":"Folder","children":[{"name":"Bar","className":"Folder","children":[{"name":"Bottom","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Bottom\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Bottom\\cfusion.story.luau"]}]},{"name":"Top","className":"Folder","children":[{"name":"Base","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Base.luau"]},{"name":"Center","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Center\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Center\\cfusion.story.luau"]}]},{"name":"Large","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Large\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Large\\cfusion.story.luau"]}]},{"name":"Medium","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Medium\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Medium\\cfusion.story.luau"]}]},{"name":"Small","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Small\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Small\\cfusion.story.luau"]}]}]}]},{"name":"Button","className":"Folder","children":[{"name":"Badge","className":"ModuleScript","filePaths":["src\\Component\\Button\\Badge\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\Badge\\cfusion.story.luau"]}]},{"name":"Base","className":"ModuleScript","filePaths":["src\\Component\\Button\\Base.luau"]},{"name":"ElevatedButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\ElevatedButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\ElevatedButton\\cfusion.story.luau"]}]},{"name":"ExtendedFAB","className":"ModuleScript","filePaths":["src\\Component\\Button\\ExtendedFAB\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\ExtendedFAB\\cfusion.story.luau"]}]},{"name":"FAB","className":"ModuleScript","filePaths":["src\\Component\\Button\\FAB\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\FAB\\cfusion.story.luau"]}]},{"name":"FilledButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledButton\\cfusion.story.luau"]}]},{"name":"FilledIconButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledIconButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledIconButton\\cfusion.story.luau"]}]},{"name":"IconButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\IconButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\IconButton\\cfusion.story.luau"]}]},{"name":"OutlinedButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedButton\\cfusion.story.luau"]}]},{"name":"OutlinedIconButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedIconButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedIconButton\\cfusion.story.luau"]}]},{"name":"Segmented","className":"ModuleScript","filePaths":["src\\Component\\Button\\Segmented\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\Segmented\\cfusion.story.luau"]}]},{"name":"TextButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\TextButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\TextButton\\cfusion.story.luau"]}]}]}]},{"name":"Config","className":"ModuleScript","filePaths":["src\\Config.luau"]},{"name":"Enums","className":"ModuleScript","filePaths":["src\\Enums.luau"]},{"name":"Sounds","className":"ModuleScript","filePaths":["src\\Sounds.luau"]},{"name":"Test","className":"Folder","children":[{"name":"Source.cfusion","className":"ModuleScript","filePaths":["src\\Test\\Source.cfusion.luau"]}]},{"name":"Types","className":"ModuleScript","filePaths":["src\\Types.luau"]},{"name":"Util","className":"ModuleScript","filePaths":["src\\Util.luau"]}]}]}]}]} \ No newline at end of file +{"name":"synthetic-test","className":"DataModel","filePaths":["dev.project.json"],"children":[{"name":"ReplicatedStorage","className":"ReplicatedStorage","children":[{"name":"Packages","className":"Folder","children":[{"name":"ColdFusion","className":"ModuleScript","filePaths":["Packages\\ColdFusion.lua"]},{"name":"CurveUtil","className":"ModuleScript","filePaths":["Packages\\CurveUtil.lua"]},{"name":"Format","className":"ModuleScript","filePaths":["Packages\\Format.lua"]},{"name":"Fusion","className":"ModuleScript","filePaths":["Packages\\Fusion.lua"]},{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\Maid.lua"]},{"name":"MaterialIcons","className":"ModuleScript","filePaths":["Packages\\MaterialIcons.lua"]},{"name":"MeshUtil","className":"ModuleScript","filePaths":["Packages\\MeshUtil.lua"]},{"name":"Roact","className":"ModuleScript","filePaths":["Packages\\Roact.lua"]},{"name":"Signal","className":"ModuleScript","filePaths":["Packages\\Signal.lua"]},{"name":"TableUtil","className":"ModuleScript","filePaths":["Packages\\TableUtil.lua"]},{"name":"_Index","className":"Folder","children":[{"name":"elttob_fusion@0.2.0","className":"Folder","children":[{"name":"fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\init.lua","Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\default.project.json"],"children":[{"name":"Animation","className":"Folder","children":[{"name":"Spring","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\Spring.lua"]},{"name":"SpringScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\SpringScheduler.lua"]},{"name":"Tween","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\Tween.lua"]},{"name":"TweenScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\TweenScheduler.lua"]},{"name":"getTweenRatio","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\getTweenRatio.lua"]},{"name":"lerpType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\lerpType.lua"]},{"name":"packType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\packType.lua"]},{"name":"springCoefficients","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\springCoefficients.lua"]},{"name":"unpackType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\unpackType.lua"]}]},{"name":"Colour","className":"Folder","children":[{"name":"Oklab","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Colour\\Oklab.lua"]}]},{"name":"Dependencies","className":"Folder","children":[{"name":"captureDependencies","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\captureDependencies.lua"]},{"name":"initDependency","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\initDependency.lua"]},{"name":"sharedState","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\sharedState.lua"]},{"name":"updateAll","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\updateAll.lua"]},{"name":"useDependency","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\useDependency.lua"]}]},{"name":"Instances","className":"Folder","children":[{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Children.lua"]},{"name":"Cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Cleanup.lua"]},{"name":"Hydrate","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Hydrate.lua"]},{"name":"New","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\New.lua"]},{"name":"OnChange","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\OnChange.lua"]},{"name":"OnEvent","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\OnEvent.lua"]},{"name":"Out","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Out.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Ref.lua"]},{"name":"applyInstanceProps","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\applyInstanceProps.lua"]},{"name":"defaultProps","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\defaultProps.lua"]}]},{"name":"Logging","className":"Folder","children":[{"name":"logError","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logError.lua"]},{"name":"logErrorNonFatal","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logErrorNonFatal.lua"]},{"name":"logWarn","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logWarn.lua"]},{"name":"messages","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\messages.lua"]},{"name":"parseError","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\parseError.lua"]}]},{"name":"PubTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\PubTypes.lua"]},{"name":"State","className":"Folder","children":[{"name":"Computed","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Computed.lua"]},{"name":"ForKeys","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForKeys.lua"]},{"name":"ForPairs","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForPairs.lua"]},{"name":"ForValues","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForValues.lua"]},{"name":"Observer","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Observer.lua"]},{"name":"Value","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Value.lua"]},{"name":"unwrap","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\unwrap.lua"]}]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Types.lua"]},{"name":"Utility","className":"Folder","children":[{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\None.lua"]},{"name":"cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\cleanup.lua"]},{"name":"doNothing","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\doNothing.lua"]},{"name":"isSimilar","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\isSimilar.lua"]},{"name":"needsDestruction","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\needsDestruction.lua"]},{"name":"restrictRead","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\restrictRead.lua"]},{"name":"xtypeof","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\xtypeof.lua"]}]}]}]},{"name":"nightcycle_cold-fusion@9.0.7","className":"Folder","children":[{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\Maid.lua"]},{"name":"ServiceProxy","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\ServiceProxy.lua"]},{"name":"Signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\Signal.lua"]},{"name":"TableUtil","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\TableUtil.lua"]},{"name":"cold-fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\init.luau","Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\default.project.json"],"children":[{"name":"Fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\init.lua"],"children":[{"name":"Animation","className":"Folder","children":[{"name":"Spring","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\Spring.lua"]},{"name":"SpringScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\SpringScheduler.lua"]},{"name":"Tween","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\Tween.lua"]},{"name":"TweenScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\TweenScheduler.lua"]},{"name":"getTweenRatio","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\getTweenRatio.lua"]},{"name":"lerpType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\lerpType.lua"]},{"name":"packType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\packType.lua"]},{"name":"springCoefficients","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\springCoefficients.lua"]},{"name":"unpackType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\unpackType.lua"]}]},{"name":"Colour","className":"Folder","children":[{"name":"Oklab","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Colour\\Oklab.lua"]}]},{"name":"Instances","className":"Folder","children":[{"name":"Attribute","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Attribute.lua"]},{"name":"AttributeChange","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\AttributeChange.lua"]},{"name":"AttributeOut","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\AttributeOut.lua"]},{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Children.lua"]},{"name":"Cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Cleanup.lua"]},{"name":"Hydrate","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Hydrate.lua"]},{"name":"New","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\New.lua"]},{"name":"OnChange","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\OnChange.lua"]},{"name":"OnEvent","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\OnEvent.lua"]},{"name":"Out","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Out.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Ref.lua"]},{"name":"applyInstanceProps","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\applyInstanceProps.lua"]},{"name":"defaultProps","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\defaultProps.lua"]}]},{"name":"Logging","className":"Folder","children":[{"name":"logError","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logError.lua"]},{"name":"logErrorNonFatal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logErrorNonFatal.lua"]},{"name":"logWarn","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logWarn.lua"]},{"name":"messages","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\messages.lua"]},{"name":"parseError","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\parseError.lua"]}]},{"name":"PubTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\PubTypes.lua"]},{"name":"State","className":"Folder","children":[{"name":"Computed","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Computed.lua"]},{"name":"ForKeys","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForKeys.lua"]},{"name":"ForPairs","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForPairs.lua"]},{"name":"ForValues","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForValues.lua"]},{"name":"Observer","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Observer.lua"]},{"name":"Value","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Value.lua"]},{"name":"isState","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\isState.lua"]},{"name":"makeUseCallback","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\makeUseCallback.lua"]},{"name":"peek","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\peek.lua"]},{"name":"updateAll","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\updateAll.lua"]}]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Types.lua"]},{"name":"Utility","className":"Folder","children":[{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\None.lua"]},{"name":"cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\cleanup.lua"]},{"name":"doNothing","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\doNothing.lua"]},{"name":"isSimilar","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\isSimilar.lua"]},{"name":"needsDestruction","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\needsDestruction.lua"]},{"name":"restrictRead","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\restrictRead.lua"]},{"name":"xtypeof","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\xtypeof.lua"]}]}]},{"name":"InstanceTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\InstanceTypes.luau"]},{"name":"Interface","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Interface.luau"]},{"name":"Test.story","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Test.story.luau"]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Types.luau"]},{"name":"Util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Util.luau"]}]}]},{"name":"nightcycle_curve-util@1.0.0","className":"Folder","children":[{"name":"Vector","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\Vector.lua"]},{"name":"curve-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\init.lua","Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\default.project.json"],"children":[{"name":"Ease","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\Ease.lua"]},{"name":"Lerp","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\Lerp.lua"]}]}]},{"name":"nightcycle_format@0.1.3","className":"Folder","children":[{"name":"format","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\init.lua","Packages\\_Index\\nightcycle_format@0.1.3\\format\\default.project.json"],"children":[{"name":"Emoji","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\Emoji.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\init.spec.lua"]}]},{"name":"maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\maid.lua"]},{"name":"signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\signal.lua"]},{"name":"string","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\string.lua"]}]},{"name":"nightcycle_geometry-util@1.1.1","className":"Folder","children":[{"name":"geometry-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\init.lua","Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\default.project.json"],"children":[{"name":"Earcut","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\Earcut\\init.lua"],"children":[{"name":"ZeroArray","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\Earcut\\ZeroArray.lua"]}]}]}]},{"name":"nightcycle_maid@1.1.4","className":"Folder","children":[{"name":"maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\init.lua","Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\default.project.json"],"children":[{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\Maid.lua"]},{"name":"MaidTaskUtils","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\MaidTaskUtils.lua"]}]}]},{"name":"nightcycle_material-icons@1.0.1","className":"Folder","children":[{"name":"material-icons","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\init.luau","Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\default.project.json"],"children":[{"name":"Default_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_1.luau"]},{"name":"Default_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_2.luau"]},{"name":"Default_18_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_3.luau"]},{"name":"Default_18_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_4.luau"]},{"name":"Default_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_1.luau"]},{"name":"Default_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_2.luau"]},{"name":"Default_24_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_3.luau"]},{"name":"Default_24_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_4.luau"]},{"name":"Default_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_1.luau"]},{"name":"Default_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_2.luau"]},{"name":"Default_36_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_3.luau"]},{"name":"Default_36_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_4.luau"]},{"name":"Default_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_1.luau"]},{"name":"Default_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_2.luau"]},{"name":"Default_48_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_3.luau"]},{"name":"Default_48_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_4.luau"]},{"name":"Outlined_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_18_1.luau"]},{"name":"Outlined_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_18_2.luau"]},{"name":"Outlined_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_24_1.luau"]},{"name":"Outlined_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_24_2.luau"]},{"name":"Outlined_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_36_1.luau"]},{"name":"Outlined_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_36_2.luau"]},{"name":"Outlined_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_48_1.luau"]},{"name":"Outlined_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_48_2.luau"]},{"name":"Round_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_18_1.luau"]},{"name":"Round_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_18_2.luau"]},{"name":"Round_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_24_1.luau"]},{"name":"Round_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_24_2.luau"]},{"name":"Round_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_36_1.luau"]},{"name":"Round_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_36_2.luau"]},{"name":"Round_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_48_1.luau"]},{"name":"Round_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_48_2.luau"]},{"name":"Sharp_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_18_1.luau"]},{"name":"Sharp_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_18_2.luau"]},{"name":"Sharp_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_24_1.luau"]},{"name":"Sharp_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_24_2.luau"]},{"name":"Sharp_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_36_1.luau"]},{"name":"Sharp_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_36_2.luau"]},{"name":"Sharp_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_48_1.luau"]},{"name":"Sharp_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_48_2.luau"]},{"name":"TwoTone_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_18_1.luau"]},{"name":"TwoTone_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_18_2.luau"]},{"name":"TwoTone_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_24_1.luau"]},{"name":"TwoTone_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_24_2.luau"]},{"name":"TwoTone_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_36_1.luau"]},{"name":"TwoTone_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_36_2.luau"]},{"name":"TwoTone_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_48_1.luau"]},{"name":"TwoTone_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_48_2.luau"]}]}]},{"name":"nightcycle_mesh-util@1.0.3","className":"Folder","children":[{"name":"GeometryUtil","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\GeometryUtil.lua"]},{"name":"mesh-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\init.lua","Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\default.project.json"],"children":[{"name":"CornerWedgePart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\CornerWedgePart.lua"]},{"name":"Part","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\Part.lua"]},{"name":"TetraPart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\TetraPart.lua"]},{"name":"WedgePart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\WedgePart.lua"]}]}]},{"name":"nightcycle_service-proxy@1.0.0","className":"Folder","children":[{"name":"service-proxy","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_service-proxy@1.0.0\\service-proxy\\src\\init.lua","Packages\\_Index\\nightcycle_service-proxy@1.0.0\\service-proxy\\default.project.json"]}]},{"name":"nightcycle_signal@1.0.2","className":"Folder","children":[{"name":"signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_signal@1.0.2\\signal\\src\\init.lua","Packages\\_Index\\nightcycle_signal@1.0.2\\signal\\default.project.json"]}]},{"name":"nightcycle_string@0.1.0","className":"Folder","children":[{"name":"string","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_string@0.1.0\\string\\src\\init.lua","Packages\\_Index\\nightcycle_string@0.1.0\\string\\default.project.json"],"children":[{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_string@0.1.0\\string\\src\\init.spec.lua"]}]}]},{"name":"nightcycle_table-util@1.1.0","className":"Folder","children":[{"name":"table-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_table-util@1.1.0\\table-util\\src\\init.lua","Packages\\_Index\\nightcycle_table-util@1.1.0\\table-util\\default.project.json"]}]},{"name":"nightcycle_vector@1.0.2","className":"Folder","children":[{"name":"vector","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_vector@1.0.2\\vector\\src\\init.lua","Packages\\_Index\\nightcycle_vector@1.0.2\\vector\\default.project.json"]}]},{"name":"roblox_roact@1.4.4","className":"Folder","children":[{"name":"roact","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\init.lua","Packages\\_Index\\roblox_roact@1.4.4\\roact\\default.project.json"],"children":[{"name":"Binding","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Binding.lua"]},{"name":"Binding.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Binding.spec.lua"]},{"name":"Component","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.lua"]},{"name":"Component.spec","className":"Folder","children":[{"name":"context.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\context.spec.lua"]},{"name":"defaultProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\defaultProps.spec.lua"]},{"name":"didMount.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\didMount.spec.lua"]},{"name":"didUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\didUpdate.spec.lua"]},{"name":"extend.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\extend.spec.lua"]},{"name":"getDerivedStateFromProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\getDerivedStateFromProps.spec.lua"]},{"name":"getElementTraceback.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\getElementTraceback.spec.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\init.spec.lua"]},{"name":"legacyContext.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\legacyContext.spec.lua"]},{"name":"render.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\render.spec.lua"]},{"name":"setState.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\setState.spec.lua"]},{"name":"shouldUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\shouldUpdate.spec.lua"]},{"name":"validateProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\validateProps.spec.lua"]},{"name":"willUnmount.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\willUnmount.spec.lua"]},{"name":"willUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\willUpdate.spec.lua"]}]},{"name":"ComponentLifecyclePhase","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ComponentLifecyclePhase.lua"]},{"name":"Config","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Config.lua"]},{"name":"Config.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Config.spec.lua"]},{"name":"ElementKind","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementKind.lua"]},{"name":"ElementKind.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementKind.spec.lua"]},{"name":"ElementUtils","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementUtils.lua"]},{"name":"ElementUtils.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementUtils.spec.lua"]},{"name":"GlobalConfig","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\GlobalConfig.lua"]},{"name":"GlobalConfig.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\GlobalConfig.spec.lua"]},{"name":"Logging","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Logging.lua"]},{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\None.lua"]},{"name":"NoopRenderer","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\NoopRenderer.lua"]},{"name":"Portal","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Portal.lua"]},{"name":"PropMarkers","className":"Folder","children":[{"name":"Change","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Change.lua"]},{"name":"Change.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Change.spec.lua"]},{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Children.lua"]},{"name":"Event","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Event.lua"]},{"name":"Event.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Event.spec.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Ref.lua"]}]},{"name":"PureComponent","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PureComponent.lua"]},{"name":"PureComponent.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PureComponent.spec.lua"]},{"name":"RobloxRenderer","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\RobloxRenderer.lua"]},{"name":"RobloxRenderer.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\RobloxRenderer.spec.lua"]},{"name":"SingleEventManager","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\SingleEventManager.lua"]},{"name":"SingleEventManager.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\SingleEventManager.spec.lua"]},{"name":"Symbol","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Symbol.lua"]},{"name":"Symbol.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Symbol.spec.lua"]},{"name":"Type","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Type.lua"]},{"name":"Type.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Type.spec.lua"]},{"name":"assertDeepEqual","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assertDeepEqual.lua"]},{"name":"assertDeepEqual.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assertDeepEqual.spec.lua"]},{"name":"assign","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assign.lua"]},{"name":"assign.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assign.spec.lua"]},{"name":"createContext","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createContext.lua"]},{"name":"createContext.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createContext.spec.lua"]},{"name":"createElement","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createElement.lua"]},{"name":"createElement.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createElement.spec.lua"]},{"name":"createFragment","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createFragment.lua"]},{"name":"createFragment.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createFragment.spec.lua"]},{"name":"createReconciler","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconciler.lua"]},{"name":"createReconciler.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconciler.spec.lua"]},{"name":"createReconcilerCompat","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconcilerCompat.lua"]},{"name":"createReconcilerCompat.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconcilerCompat.spec.lua"]},{"name":"createRef","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createRef.lua"]},{"name":"createRef.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createRef.spec.lua"]},{"name":"createSignal","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSignal.lua"]},{"name":"createSignal.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSignal.spec.lua"]},{"name":"createSpy","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSpy.lua"]},{"name":"createSpy.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSpy.spec.lua"]},{"name":"forwardRef","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\forwardRef.lua"]},{"name":"forwardRef.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\forwardRef.spec.lua"]},{"name":"getDefaultInstanceProperty","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\getDefaultInstanceProperty.lua"]},{"name":"getDefaultInstanceProperty.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\getDefaultInstanceProperty.spec.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\init.spec.lua"]},{"name":"internalAssert","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\internalAssert.lua"]},{"name":"invalidSetStateMessages","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\invalidSetStateMessages.lua"]},{"name":"oneChild","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\oneChild.lua"]},{"name":"oneChild.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\oneChild.spec.lua"]},{"name":"strict","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\strict.lua"]},{"name":"strict.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\strict.spec.lua"]}]}]}]},{"name":"synthetic","className":"ModuleScript","filePaths":["src\\init.luau"],"children":[{"name":"Color","className":"ModuleScript","filePaths":["src\\Color\\init.luau"],"children":[{"name":"Blend","className":"ModuleScript","filePaths":["src\\Color\\Blend.luau"]},{"name":"ColorUtils","className":"ModuleScript","filePaths":["src\\Color\\ColorUtils.luau"]},{"name":"HCT","className":"ModuleScript","filePaths":["src\\Color\\HCT\\init.luau"],"children":[{"name":"Cam16","className":"ModuleScript","filePaths":["src\\Color\\HCT\\Cam16.luau"]},{"name":"Solver","className":"ModuleScript","filePaths":["src\\Color\\HCT\\Solver.luau"]}]},{"name":"MathUtils","className":"ModuleScript","filePaths":["src\\Color\\MathUtils.luau"]},{"name":"Palettes","className":"Folder","children":[{"name":"Core","className":"ModuleScript","filePaths":["src\\Color\\Palettes\\Core.luau"]},{"name":"Tonal","className":"ModuleScript","filePaths":["src\\Color\\Palettes\\Tonal.luau"]}]},{"name":"Scheme","className":"ModuleScript","filePaths":["src\\Color\\Scheme\\init.luau"]},{"name":"ViewingConditions","className":"ModuleScript","filePaths":["src\\Color\\ViewingConditions.luau"]}]},{"name":"Component","className":"Folder","children":[{"name":"Bar","className":"Folder","children":[{"name":"Bottom","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Bottom\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Bottom\\cfusion.story.luau"]}]},{"name":"Top","className":"Folder","children":[{"name":"Base","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Base.luau"]},{"name":"Center","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Center\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Center\\cfusion.story.luau"]}]},{"name":"Large","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Large\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Large\\cfusion.story.luau"]}]},{"name":"Medium","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Medium\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Medium\\cfusion.story.luau"]}]},{"name":"Small","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Small\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Small\\cfusion.story.luau"]}]}]}]},{"name":"Button","className":"Folder","children":[{"name":"Badge","className":"ModuleScript","filePaths":["src\\Component\\Button\\Badge\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\Badge\\cfusion.story.luau"]}]},{"name":"Base","className":"ModuleScript","filePaths":["src\\Component\\Button\\Base.luau"]},{"name":"ElevatedButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\ElevatedButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\ElevatedButton\\cfusion.story.luau"]}]},{"name":"ExtendedFAB","className":"ModuleScript","filePaths":["src\\Component\\Button\\ExtendedFAB\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\ExtendedFAB\\cfusion.story.luau"]}]},{"name":"FAB","className":"ModuleScript","filePaths":["src\\Component\\Button\\FAB\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\FAB\\cfusion.story.luau"]}]},{"name":"FilledButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledButton\\cfusion.story.luau"]}]},{"name":"FilledIconButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledIconButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledIconButton\\cfusion.story.luau"]}]},{"name":"IconButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\IconButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\IconButton\\cfusion.story.luau"]}]},{"name":"OutlinedButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedButton\\cfusion.story.luau"]}]},{"name":"OutlinedIconButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedIconButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedIconButton\\cfusion.story.luau"]}]},{"name":"Segmented","className":"ModuleScript","filePaths":["src\\Component\\Button\\Segmented\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\Segmented\\cfusion.story.luau"]}]},{"name":"TextButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\TextButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\TextButton\\cfusion.story.luau"]}]}]}]},{"name":"Config","className":"ModuleScript","filePaths":["src\\Config.luau"]},{"name":"Enums","className":"ModuleScript","filePaths":["src\\Enums.luau"]},{"name":"Sounds","className":"ModuleScript","filePaths":["src\\Sounds.luau"]},{"name":"Test","className":"Folder","children":[{"name":"Source.cfusion","className":"ModuleScript","filePaths":["src\\Test\\Source.cfusion.luau"]}]},{"name":"Types","className":"ModuleScript","filePaths":["src\\Types.luau"]},{"name":"Util","className":"ModuleScript","filePaths":["src\\Util.luau"]}]}]}]}]} \ No newline at end of file diff --git a/src/Color/Blend.luau b/src/Color/Blend.luau new file mode 100644 index 00000000..0e0c7bdc --- /dev/null +++ b/src/Color/Blend.luau @@ -0,0 +1,48 @@ +--!strict +-- https://github.com/material-foundation/material-color-utilities/blob/f5d03da60c268b43928f3a24d6bf499e2564d39a/typescript/blend/blend.ts +local Cam16 = require(script.Parent:WaitForChild("HCT"):WaitForChild("Cam16")) +local HCT = require(script.Parent:WaitForChild("HCT")) +local ColorUtils = require(script.Parent:WaitForChild("ColorUtils")) + +local Blend = {} + +function Blend.harmonize(designColor: number, sourceColor: number): number + local fromHct = HCT.fromInt(designColor); + local toHct = HCT.fromInt(sourceColor); + local differenceDegrees = MathUtils.differenceDegrees(fromHct.hue, toHct.hue); + local rotationDegrees = math.min(differenceDegrees * 0.5, 15.0); + local outputHue = MathUtils.sanitizeDegreesDouble( + fromHct.hue + + rotationDegrees * MathUtils.rotationDirection(fromHct.hue, toHct.hue)); + return HCT.from(outputHue, fromHct.chroma, fromHct.tone):toInt(); +end + +function Blend.hctHue(from: number, to: number, amount: number): number + local ucs = Blend.cam16Ucs(from, to, amount); + local ucsCam = Cam16.fromInt(ucs); + local fromCam = Cam16.fromInt(from); + local blended = HCT.from( + ucsCam.hue, + fromCam.chroma, + ColorUtils.lstarFromArgb(from), + ); + return blended:toInt(); +end + +function Blend.cam16Ucs(from: number, to: number, amount: number): number + local fromCam = Cam16.fromInt(from); + local toCam = Cam16.fromInt(to); + local fromJ = fromCam.jstar; + local fromA = fromCam.astar; + local fromB = fromCam.bstar; + local toJ = toCam.jstar; + local toA = toCam.astar; + local toB = toCam.bstar; + local jstar = fromJ + (toJ - fromJ) * amount; + local astar = fromA + (toA - fromA) * amount; + local bstar = fromB + (toB - fromB) * amount; + return Cam16.fromUcs(jstar, astar, bstar).toInt(); +end + + +return Blend \ No newline at end of file diff --git a/src/Color/ColorUtils.luau b/src/Color/ColorUtils.luau new file mode 100644 index 00000000..3941af59 --- /dev/null +++ b/src/Color/ColorUtils.luau @@ -0,0 +1 @@ +return {} \ No newline at end of file diff --git a/src/Color/HCT/Cam16.luau b/src/Color/HCT/Cam16.luau new file mode 100644 index 00000000..1463b288 --- /dev/null +++ b/src/Color/HCT/Cam16.luau @@ -0,0 +1,333 @@ +--!strict +-- https://github.com/material-foundation/material-color-utilities/blob/f5d03da60c268b43928f3a24d6bf499e2564d39a/typescript/hct/cam16.ts +local ColorUtils = require(script.Parent.Parent:WaitForChild("ColorUtils")) +local ViewingConditions = require(script.Parent.Parent:WaitForChild("ViewingConditions")) + +-- Types +type ViewingConditions = ViewingConditions.ViewingConditions +export type Cam16 = { + __index: Cam16, + hue: number, + chroma: number, + j: number, + q: number, + m: number, + s: number, + jstar: number, + astar: number, + bstar: number, + new: (hue: number, chroma: number, j: number, q: number, m: number, s: number, jstar: number, astar: number, bstar: number) -> Cam16, + fromInt: (argb: number) -> Cam16, + fromIntInViewingConditions: (argb: number, viewingConditions: ViewingConditions) -> Cam16, + fromJchInViewingConditions: (j: number, c: number, h: number, viewingConditions: ViewingConditions) -> Cam16, + fromUcs: (jstar: number, astar: number, bstar: number) -> Cam16, + fromJch: (j: number, c: number, h: number) -> Cam16, + fromUcsInViewingConditions: (jstar: number, astar: number, bstar: number, viewingConditions: ViewingConditions) -> Cam16, + distance: (self: Cam16, other: Cam16) -> number, + toInt: (self: Cam16) -> number, + viewed: (self: Cam16, viewingConditions: ViewingConditions) -> number, + fromXyzInViewingConditions: (x: number, y: number, z: number, viewingConditions: ViewingConditions) -> Cam16, + xyzInViewingConditions: (self: Cam16, viewingConditions: ViewingConditions) -> { number }, +} + +-- Class +local Cam16 = {} :: Cam16 +Cam16.__index = Cam16 + +function Cam16.new(hue: number, chroma: number, j: number, q: number, m: number, s: number, jstar: number, astar: number, bstar: number) + local self: Cam16 = setmetatable({}, Cam16) :: any + self.hue = hue + self.chroma = chroma + self.j = j + self.q = q + self.m = m + self.s = s + self.jstar = jstar + self.astar = astar + self.bstar = bstar + table.freeze(self) + return self +end + +function Cam16:distance(other: Cam16): number + local dJ = self.jstar - other.jstar + local dA = self.astar - other.astar + local dB = self.bstar - other.bstar + local dEPrime = math.sqrt(dJ * dJ + dA * dA + dB * dB) + local dE = 1.41 * math.pow(dEPrime, 0.63) + return dE +end + +function Cam16.fromInt(argb: number): Cam16 + return Cam16.fromIntInViewingConditions(argb, ViewingConditions.DEFAULT) +end + +function Cam16.fromIntInViewingConditions(argb: number, viewingConditions: ViewingConditions): Cam16 + local red = bit32.rshift(bit32.band(argb, 0x00ff0000), 16) + local green = bit32.rshift(bit32.band(argb, 0x0000ff00), 8) + local blue = bit32.band(argb, 0x000000ff) + + local redL = ColorUtils.linearized(red) + local greenL = ColorUtils.linearized(green) + local blueL = ColorUtils.linearized(blue) + + local x = 0.41233895 * redL + 0.35762064 * greenL + 0.18051042 * blueL + local y = 0.2126 * redL + 0.7152 * greenL + 0.0722 * blueL + local z = 0.01932141 * redL + 0.11916382 * greenL + 0.95034478 * blueL + local rC = 0.401288 * x + 0.650173 * y - 0.051461 * z + local gC = -0.250268 * x + 1.204414 * y + 0.045854 * z + local bC = -0.002079 * x + 0.048952 * y + 0.953127 * z + + local rD = viewingConditions.rgbD[0] * rC + local gD = viewingConditions.rgbD[1] * gC + local bD = viewingConditions.rgbD[2] * bC + + local rAF = math.pow((viewingConditions.fl * math.abs(rD)) / 100.0, 0.42) + local gAF = math.pow((viewingConditions.fl * math.abs(gD)) / 100.0, 0.42) + local bAF = math.pow((viewingConditions.fl * math.abs(bD)) / 100.0, 0.42) + + local rA = (math.sign(rD) * 400.0 * rAF) / (rAF + 27.13) + local gA = (math.sign(gD) * 400.0 * gAF) / (gAF + 27.13) + local bA = (math.sign(bD) * 400.0 * bAF) / (bAF + 27.13) + + local a = (11.0 * rA + -12.0 * gA + bA) / 11.0 + local b = (rA + gA - 2.0 * bA) / 9.0 + local u = (20.0 * rA + 20.0 * gA + 21.0 * bA) / 20.0 + local p2 = (40.0 * rA + 20.0 * gA + bA) / 20.0 + local atan2 = math.atan2(b, a) + local atanDegrees = (atan2 * 180.0) / math.pi + local hue: number + if atanDegrees < 0 then + hue = atanDegrees + 360.0 + elseif atanDegrees >= 360 then + hue = atanDegrees - 360.0 + else + hue = atanDegrees + end + local hueRadians = (hue * math.pi) / 180.0 + + local ac = p2 * viewingConditions.nbb + local j = 100.0 * math.pow(ac / viewingConditions.aw, viewingConditions.c * viewingConditions.z) + local q = (4.0 / viewingConditions.c) * math.sqrt(j / 100.0) * (viewingConditions.aw + 4.0) * viewingConditions.fLRoot + + local huePrime + if hue < 20.14 then + huePrime = hue + 360 + else + huePrime = hue + end + + local eHue = 0.25 * (math.cos((huePrime * math.pi) / 180.0 + 2.0) + 3.8) + local p1 = (50000.0 / 13.0) * eHue * viewingConditions.nc * viewingConditions.ncb + local t = (p1 * math.sqrt(a * a + b * b)) / (u + 0.305) + local alpha = math.pow(t, 0.9) * math.pow(1.64 - math.pow(0.29, viewingConditions.n), 0.73) + local c = alpha * math.sqrt(j / 100.0) + local m = c * viewingConditions.fLRoot + local s = 50.0 * math.sqrt((alpha * viewingConditions.c) / (viewingConditions.aw + 4.0)) + local jstar = ((1.0 + 100.0 * 0.007) * j) / (1.0 + 0.007 * j) + local mstar = (1.0 / 0.0228) * math.log(1.0 + 0.0228 * m) + local astar = mstar * math.cos(hueRadians) + local bstar = mstar * math.sin(hueRadians) + + return Cam16.new(hue, c, j, q, m, s, jstar, astar, bstar) +end + +function Cam16.fromJch(j: number, c: number, h: number): Cam16 + return Cam16.fromJchInViewingConditions(j, c, h, ViewingConditions.DEFAULT) +end + +function Cam16.fromJchInViewingConditions(j: number, c: number, h: number, viewingConditions: ViewingConditions): Cam16 + local q = (4.0 / viewingConditions.c) * math.sqrt(j / 100.0) * (viewingConditions.aw + 4.0) * viewingConditions.fLRoot + local m = c * viewingConditions.fLRoot + local alpha = c / math.sqrt(j / 100.0) + local s = 50.0 * math.sqrt((alpha * viewingConditions.c) / (viewingConditions.aw + 4.0)) + local hueRadians = (h * math.pi) / 180.0 + local jstar = ((1.0 + 100.0 * 0.007) * j) / (1.0 + 0.007 * j) + local mstar = (1.0 / 0.0228) * math.log(1.0 + 0.0228 * m) + local astar = mstar * math.cos(hueRadians) + local bstar = mstar * math.sin(hueRadians) + return Cam16.new(h, c, j, q, m, s, jstar, astar, bstar) +end + +function Cam16.fromUcs(jstar: number, astar: number, bstar: number): Cam16 + return Cam16.fromUcsInViewingConditions(jstar, astar, bstar, ViewingConditions.DEFAULT) +end + +function Cam16.fromUcsInViewingConditions(jstar: number, astar: number, bstar: number, viewingConditions: ViewingConditions): Cam16 + local a = astar + local b = bstar + local m = math.sqrt(a * a + b * b) + local M = (math.exp(m * 0.0228) - 1.0) / 0.0228 + local c = M / viewingConditions.fLRoot + local h = math.atan2(b, a) * (180.0 / math.pi) + if h < 0.0 then + h += 360.0 + end + local j = jstar / (1 - (jstar - 100) * 0.007) + return Cam16.fromJchInViewingConditions(j, c, h, viewingConditions) +end + +function Cam16:toInt(): number + return self.viewed(ViewingConditions.DEFAULT) +end + +function Cam16:viewed(viewingConditions: ViewingConditions): number + local alpha + if self.chroma == 0.0 or self.j == 0.0 then + alpha = 0.0 + else + alpha = self.chroma / math.sqrt(self.j / 100.0) + end + + local t = math.pow(alpha / math.pow(1.64 - math.pow(0.29, viewingConditions.n), 0.73), 1.0 / 0.9) + local hRad = (self.hue * math.pi) / 180.0 + + local eHue = 0.25 * (math.cos(hRad + 2.0) + 3.8) + local ac = viewingConditions.aw * math.pow(self.j / 100.0, 1.0 / viewingConditions.c / viewingConditions.z) + local p1 = eHue * (50000.0 / 13.0) * viewingConditions.nc * viewingConditions.ncb + local p2 = ac / viewingConditions.nbb + + local hSin = math.sin(hRad) + local hCos = math.cos(hRad) + + local gamma = (23.0 * (p2 + 0.305) * t) / (23.0 * p1 + 11.0 * t * hCos + 108.0 * t * hSin) + local a = gamma * hCos + local b = gamma * hSin + local rA = (460.0 * p2 + 451.0 * a + 288.0 * b) / 1403.0 + local gA = (460.0 * p2 - 891.0 * a - 261.0 * b) / 1403.0 + local bA = (460.0 * p2 - 220.0 * a - 6300.0 * b) / 1403.0 + + local rCBase = math.max(0, (27.13 * math.abs(rA)) / (400.0 - math.abs(rA))) + local rC = math.sign(rA) * (100.0 / viewingConditions.fl) * math.pow(rCBase, 1.0 / 0.42) + local gCBase = math.max(0, (27.13 * math.abs(gA)) / (400.0 - math.abs(gA))) + local gC = math.sign(gA) * (100.0 / viewingConditions.fl) * math.pow(gCBase, 1.0 / 0.42) + local bCBase = math.max(0, (27.13 * math.abs(bA)) / (400.0 - math.abs(bA))) + local bC = math.sign(bA) * (100.0 / viewingConditions.fl) * math.pow(bCBase, 1.0 / 0.42) + + local rF = rC / viewingConditions.rgbD[1] + local gF = gC / viewingConditions.rgbD[2] + local bF = bC / viewingConditions.rgbD[3] + + local x = 1.86206786 * rF - 1.01125463 * gF + 0.14918677 * bF + local y = 0.38752654 * rF + 0.62144744 * gF - 0.00897398 * bF + local z = -0.01584150 * rF - 0.03412294 * gF + 1.04996444 * bF + + -- Assuming ColorUtils.argbFromXyz is a function that converts XYZ to ARGB. + local argb = ColorUtils.argbFromXyz(x, y, z) + return argb +end + +function Cam16.fromXyzInViewingConditions(x: number, y: number, z: number, viewingConditions: ViewingConditions): Cam16 + local rC = 0.401288 * x + 0.650173 * y - 0.051461 * z + local gC = -0.250268 * x + 1.204414 * y + 0.045854 * z + local bC = -0.002079 * x + 0.048952 * y + 0.953127 * z + + --Discount illuminant + local rD = viewingConditions.rgbD[0] * rC + local gD = viewingConditions.rgbD[1] * gC + local bD = viewingConditions.rgbD[2] * bC + + --chromatic adaptation + local rAF = math.pow(viewingConditions.fl * math.abs(rD) / 100.0, 0.42) + local gAF = math.pow(viewingConditions.fl * math.abs(gD) / 100.0, 0.42) + local bAF = math.pow(viewingConditions.fl * math.abs(bD) / 100.0, 0.42) + local rA = math.sign(rD) * 400.0 * rAF / (rAF + 27.13) + local gA = math.sign(gD) * 400.0 * gAF / (gAF + 27.13) + local bA = math.sign(bD) * 400.0 * bAF / (bAF + 27.13) + + --redness-greenness + local a = (11.0 * rA + -12.0 * gA + bA) / 11.0 + --yellowness-blueness + local b = (rA + gA - 2.0 * bA) / 9.0 + + --auxiliary components + local u = (20.0 * rA + 20.0 * gA + 21.0 * bA) / 20.0 + local p2 = (40.0 * rA + 20.0 * gA + bA) / 20.0 + + --hue + local atan2 = math.atan2(b, a) + local atanDegrees = atan2 * 180.0 / math.pi + + local hue + if atanDegrees < 0 then + hue = atanDegrees + 360.0 + elseif atanDegrees >= 360 then + hue = atanDegrees - 360 + else + hue = atanDegrees + end + local hueRadians = hue * math.pi / 180.0 + + --achromatic response to color + local ac = p2 * viewingConditions.nbb + + --CAM16 lightness and brightness + local J = 100.0 * math.pow(ac / viewingConditions.aw, viewingConditions.c * viewingConditions.z) + local Q = (4.0 / viewingConditions.c) * math.sqrt(J / 100.0) * (viewingConditions.aw + 4.0) * viewingConditions.fLRoot + + local huePrime = hue < 20.14 and hue + 360 or hue + local eHue = 0.25 * (math.cos(huePrime * math.pi / 180.0 + 2.0) + 3.8) + local p1 = 50000.0 / 13.0 * eHue * viewingConditions.nc * viewingConditions.ncb + local t = p1 * math.sqrt(a * a + b * b) / (u + 0.305) + local alpha = math.pow(t, 0.9) * math.pow(1.64 - math.pow(0.29, viewingConditions.n), 0.73) + + --CAM16 chroma, colorfulness, chroma + local C = alpha * math.sqrt(J / 100.0) + local M = C * viewingConditions.fLRoot + local s = 50.0 * math.sqrt((alpha * viewingConditions.c) / (viewingConditions.aw + 4.0)) + + --CAM16-UCS components + local jstar = (1.0 + 100.0 * 0.007) * J / (1.0 + 0.007 * J) + local mstar = math.log(1.0 + 0.0228 * M) / 0.0228 + local astar = mstar * math.cos(hueRadians) + local bstar = mstar * math.sin(hueRadians) + return Cam16.new(hue, C, J, Q, M, s, jstar, astar, bstar) +end + +--- XYZ representation of CAM16 seen in [viewingConditions]. +function Cam16:xyzInViewingConditions(viewingConditions: ViewingConditions): { number } + local alpha + if self.chroma == 0.0 or self.j == 0.0 then + alpha = 0.0 + else + alpha = self.chroma / math.sqrt(self.j / 100.0) + end + + local t = math.pow(alpha / math.pow(1.64 - math.pow(0.29, viewingConditions.n), 0.73), 1.0 / 0.9) + local hRad = self.hue * math.pi / 180.0 + + local eHue = 0.25 * (math.cos(hRad + 2.0) + 3.8) + local ac = viewingConditions.aw * math.pow(self.j / 100.0, 1.0 / (viewingConditions.c * viewingConditions.z)) + + local p1 = eHue * (50000.0 / 13.0) * viewingConditions.nc * viewingConditions.ncb + + local p2 = (ac / viewingConditions.nbb) + + local hSin = math.sin(hRad) + local hCos = math.cos(hRad) + + local gamma = 23.0 * (p2 + 0.305) * t / (23.0 * p1 + 11 * t * hCos + 108.0 * t * hSin) + local a = gamma * hCos + local b = gamma * hSin + local rA = (460.0 * p2 + 451.0 * a + 288.0 * b) / 1403.0 + local gA = (460.0 * p2 - 891.0 * a - 261.0 * b) / 1403.0 + local bA = (460.0 * p2 - 220.0 * a - 6300.0 * b) / 1403.0 + + local rCBase = math.max(0, (27.13 * math.abs(rA)) / (400.0 - math.abs(rA))) + local rC = math.sign(rA) * (100.0 / viewingConditions.fl) * math.pow(rCBase, 1.0 / 0.42) + local gCBase = math.max(0, (27.13 * math.abs(gA)) / (400.0 - math.abs(gA))) + local gC = math.sign(gA) * (100.0 / viewingConditions.fl) * math.pow(gCBase, 1.0 / 0.42) + local bCBase = math.max(0, (27.13 * math.abs(bA)) / (400.0 - math.abs(bA))) + local bC = math.sign(bA) * (100.0 / viewingConditions.fl) * math.pow(bCBase, 1.0 / 0.42) + local rF = rC / viewingConditions.rgbD[0] + local gF = gC / viewingConditions.rgbD[1] + local bF = bC / viewingConditions.rgbD[2] + + local x = 1.86206786 * rF - 1.01125463 * gF + 0.14918677 * bF + local y = 0.38752654 * rF + 0.62144744 * gF - 0.00897398 * bF + local z = -0.01584150 * rF - 0.03412294 * gF + 1.04996444 * bF + + return { x, y, z } +end + +return Cam16 diff --git a/src/Color/HCT/Solver.luau b/src/Color/HCT/Solver.luau new file mode 100644 index 00000000..7be17770 --- /dev/null +++ b/src/Color/HCT/Solver.luau @@ -0,0 +1,580 @@ +-- https://github.com/material-foundation/material-color-utilities/blob/f5d03da60c268b43928f3a24d6bf499e2564d39a/typescript/hct/hct_solver.ts +-- This file is automatically generated. Do not modify it. +local ColorUtils = require(script.Parent.Parent:WaitForChild("ColorUtils")) +local MathUtils = require(script.Parent.Parent:WaitForChild("MathUtils")) +local Cam16 = require(script.Parent:WaitForChild("Cam16")) +local ViewingConditions = require(script.Parent.Parent:WaitForChild("ViewingConditions")) + +-- material_color_utilities is designed to have a consistent API across +-- platforms and modular components that can be moved around easily. Using a +-- class as a namespace facilitates this. +-- +-- tslint:disable:class-as-namespace +local Solver = {} + +Solver.SCALED_DISCOUNT_FROM_LINRGB = { + { + 0.001200833568784504, + 0.002389694492170889, + 0.0002795742885861124, + }, + { + 0.0005891086651375999, + 0.0029785502573438758, + 0.0003270666104008398, + }, + { + 0.00010146692491640572, + 0.0005364214359186694, + 0.0032979401770712076, + }, +} + +Solver.LINRGB_FROM_SCALED_DISCOUNT = { + { + 1373.2198709594231, + -1100.4251190754821, + -7.278681089101213, + }, + { + -271.815969077903, + 559.6580465940733, + -32.46047482791194, + }, + { + 1.9622899599665666, + -57.173814538844006, + 308.7233197812385, + }, +} + +Solver.Y_FROM_LINRGB = { 0.2126, 0.7152, 0.0722 } + +Solver.CRITICAL_PLANES = { + 0.015176349177441876, + 0.045529047532325624, + 0.07588174588720938, + 0.10623444424209313, + 0.13658714259697685, + 0.16693984095186062, + 0.19729253930674434, + 0.2276452376616281, + 0.2579979360165119, + 0.28835063437139563, + 0.3188300904430532, + 0.350925934958123, + 0.3848314933096426, + 0.42057480301049466, + 0.458183274052838, + 0.4976837250274023, + 0.5391024159806381, + 0.5824650784040898, + 0.6277969426914107, + 0.6751227633498623, + 0.7244668422128921, + 0.775853049866786, + 0.829304845476233, + 0.8848452951698498, + 0.942497089126609, + 1.0022825574869039, + 1.0642236851973577, + 1.1283421258858297, + 1.1946592148522128, + 1.2631959812511864, + 1.3339731595349034, + 1.407011200216447, + 1.4823302800086415, + 1.5599503113873272, + 1.6398909516233677, + 1.7221716113234105, + 1.8068114625156377, + 1.8938294463134073, + 1.9832442801866852, + 2.075074464868551, + 2.1693382909216234, + 2.2660538449872063, + 2.36523901573795, + 2.4669114995532007, + 2.5710888059345764, + 2.6777882626779785, + 2.7870270208169257, + 2.898822059350997, + 3.0131901897720907, + 3.1301480604002863, + 3.2497121605402226, + 3.3718988244681087, + 3.4967242352587946, + 3.624204428461639, + 3.754355295633311, + 3.887192587735158, + 4.022731918402185, + 4.160988767090289, + 4.301978482107941, + 4.445716283538092, + 4.592217266055746, + 4.741496401646282, + 4.893568542229298, + 5.048448422192488, + 5.20615066083972, + 5.3666897647573375, + 5.5300801301023865, + 5.696336044816294, + 5.865471690767354, + 6.037501145825082, + 6.212438385869475, + 6.390297286737924, + 6.571091626112461, + 6.7548350853498045, + 6.941541251256611, + 7.131223617812143, + 7.323895587840543, + 7.5195704746346665, + 7.7182615035334345, + 7.919981813454504, + 8.124744458384042, + 8.332562408825165, + 8.543448553206703, + 8.757415699253682, + 8.974476575321063, + 9.194643831691977, + 9.417930041841839, + 9.644347703669503, + 9.873909240696694, + 10.106627003236781, + 10.342513269534024, + 10.58158024687427, + 10.8238400726681, + 11.069304815507364, + 11.317986476196008, + 11.569896988756009, + 11.825048221409341, + 12.083451977536606, + 12.345119996613247, + 12.610063955123938, + 12.878295467455942, + 13.149826086772048, + 13.42466730586372, + 13.702830557985108, + 13.984327217668513, + 14.269168601521828, + 14.55736596900856, + 14.848930523210871, + 15.143873411576273, + 15.44220572664832, + 15.743938506781891, + 16.04908273684337, + 16.35764934889634, + 16.66964922287304, + 16.985093187232053, + 17.30399201960269, + 17.62635644741625, + 17.95219714852476, + 18.281524751807332, + 18.614349837764564, + 18.95068293910138, + 19.290534541298456, + 19.633915083172692, + 19.98083495742689, + 20.331304511189067, + 20.685334046541502, + 21.042933821039977, + 21.404114048223256, + 21.76888489811322, + 22.137256497705877, + 22.50923893145328, + 22.884842241736916, + 23.264076429332462, + 23.6469514538663, + 24.033477234264016, + 24.42366364919083, + 24.817520537484558, + 25.21505769858089, + 25.61628489293138, + 26.021211842414342, + 26.429848230738664, + 26.842203703840827, + 27.258287870275353, + 27.678110301598522, + 28.10168053274597, + 28.529008062403893, + 28.96010235337422, + 29.39497283293396, + 29.83362889318845, + 30.276079891419332, + 30.722335150426627, + 31.172403958865512, + 31.62629557157785, + 32.08401920991837, + 32.54558406207592, + 33.010999283389665, + 33.4802739966603, + 33.953417292456834, + 34.430438229418264, + 34.911345834551085, + 35.39614910352207, + 35.88485700094671, + 36.37747846067349, + 36.87402238606382, + 37.37449765026789, + 37.87891309649659, + 38.38727753828926, + 38.89959975977785, + 39.41588851594697, + 39.93615253289054, + 40.460400508064545, + 40.98864111053629, + 41.520882981230194, + 42.05713473317016, + 42.597404951718396, + 43.141702194811224, + 43.6900349931913, + 44.24241185063697, + 44.798841244188324, + 45.35933162437017, + 45.92389141541209, + 46.49252901546552, + 47.065252796817916, + 47.64207110610409, + 48.22299226451468, + 48.808024568002054, + 49.3971762874833, + 49.9904556690408, + 50.587870934119984, + 51.189430279724725, + 51.79514187861014, + 52.40501387947288, + 53.0190544071392, + 53.637271562750364, + 54.259673423945976, + 54.88626804504493, + 55.517063457223934, + 56.15206766869424, + 56.79128866487574, + 57.43473440856916, + 58.08241284012621, + 58.734331877617365, + 59.39049941699807, + 60.05092333227251, + 60.715611475655585, + 61.38457167773311, + 62.057811747619894, + 62.7353394731159, + 63.417162620860914, + 64.10328893648692, + 64.79372614476921, + 65.48848194977529, + 66.18756403501224, + 66.89098006357258, + 67.59873767827808, + 68.31084450182222, + 69.02730813691093, + 69.74813616640164, + 70.47333615344107, + 71.20291564160104, + 71.93688215501312, + 72.67524319850172, + 73.41800625771542, + 74.16517879925733, + 74.9167682708136, + 75.67278210128072, + 76.43322770089146, + 77.1981124613393, + 77.96744375590167, + 78.74122893956174, + 79.51947534912904, + 80.30219030335869, + 81.08938110306934, + 81.88105503125999, + 82.67721935322541, + 83.4778813166706, + 84.28304815182372, + 85.09272707154808, + 85.90692527145302, + 86.72564993000343, + 87.54890820862819, + 88.3767072518277, + 89.2090541872801, + 90.04595612594655, + 90.88742016217518, + 91.73345337380438, + 92.58406282226491, + 93.43925555268066, + 94.29903859396902, + 95.16341895893969, + 96.03240364439274, + 96.9059996312159, + 97.78421388448044, + 98.6670533535366, + 99.55452497210776, +} + +function Solver._sanitizeRadians(angle: number): number + return (angle + math.pi * 8) % (math.pi * 2) +end + +function Solver._trueDelinearized(rgbComponent: number): number + local normalized = rgbComponent / 100.0 + local delinearized = 0.0 + if normalized <= 0.0031308 then + delinearized = normalized * 12.92 + else + delinearized = 1.055 * math.pow(normalized, 1.0 / 2.4) - 0.055 + end + return delinearized * 255.0 +end + +function Solver._chromaticAdaptation(component: number): number + local af = math.pow(math.abs(component), 0.42) + return math.sign(component) * 400.0 * af / (af + 27.13) +end + +function Solver._hueOf(linrgb: { number }): number + local scaledDiscount = MathUtils.matrixMultiply(linrgb, Solver.SCALED_DISCOUNT_FROM_LINRGB) + local rA = Solver._chromaticAdaptation(scaledDiscount[0]) + local gA = Solver._chromaticAdaptation(scaledDiscount[1]) + local bA = Solver._chromaticAdaptation(scaledDiscount[2]) + -- redness-greenness + local a = (11.0 * rA + -12.0 * gA + bA) / 11.0 + -- yellowness-blueness + local b = (rA + gA - 2.0 * bA) / 9.0 + return math.atan2(b, a) +end + +function Solver._areInCyclicOrder(a: number, b: number, c: number): boolean + local deltaAB = Solver._sanitizeRadians(b - a) + local deltaAC = Solver._sanitizeRadians(c - a) + return deltaAB < deltaAC +end + +function Solver._intercept(source: number, mid: number, target: number): number + return (mid - source) / (target - source) +end + +function Solver._lerpPoint(source: { number }, t: number, target: { number }): { number } + return { + source[0] + (target[0] - source[0]) * t, + source[1] + (target[1] - source[1]) * t, + source[2] + (target[2] - source[2]) * t, + } +end + +function Solver._setCoordinate(source: { number }, coordinate: number, target: { number }, axis: number): { number } + local t = Solver.intercept(source[axis], coordinate, target[axis]) + return Solver._lerpPoint(source, t, target) +end + +function Solver._isBounded(x: number): boolean + return 0.0 <= x and x <= 100.0 +end + +function Solver._nthVertex(y: number, n: number): { number } + local kR = Solver.Y_FROM_LINRGB[0] + local kG = Solver.Y_FROM_LINRGB[1] + local kB = Solver.Y_FROM_LINRGB[2] + local coordA = if n % 4 <= 1 then 0.0 else 100.0 + local coordB = if n % 2 == 0 then 0.0 else 100.0 + if n < 4 then + local g = coordA + local b = coordB + local r = (y - g * kG - b * kB) / kR + if Solver._isBounded(r) then + return { r, g, b } + else + return { -1.0, -1.0, -1.0 } + end + elseif n < 8 then + local b = coordA + local r = coordB + local g = (y - r * kR - b * kB) / kG + if Solver._isBounded(g) then + return { r, g, b } + else + return { -1.0, -1.0, -1.0 } + end + else + local r = coordA + local g = coordB + local b = (y - r * kR - g * kG) / kB + if Solver._isBounded(b) then + return { r, g, b } + else + return { -1.0, -1.0, -1.0 } + end + end +end + +function Solver._bisectToSegment(y: number, targetHue: number): { { number } } + local left = { -1.0, -1.0, -1.0 } + local right = left + local leftHue = 0.0 + local rightHue = 0.0 + local initialized = false + local uncut = true + for n = 0, 12 - 1, 1 do + local mid = Solver._nthVertex(y, n) + if mid[0] < 0 then + continue + end + local midHue = Solver._hueOf(mid) + if not initialized then + left = mid + right = mid + leftHue = midHue + rightHue = midHue + initialized = true + continue + end + if uncut or Solver._areInCyclicOrder(leftHue, midHue, rightHue) then + uncut = false + if Solver._areInCyclicOrder(leftHue, targetHue, midHue) then + right = mid + rightHue = midHue + else + left = mid + leftHue = midHue + end + end + end + return { left, right } +end + +function Solver._midpoint(a: { number }, b: { number }): { number } + return { + (a[0] + b[0]) / 2, + (a[1] + b[1]) / 2, + (a[2] + b[2]) / 2, + } +end + +function Solver._criticalPlaneBelow(x: number): number + return math.floor(x - 0.5) +end + +function Solver._criticalPlaneAbove(x: number): number + return math.ceil(x - 0.5) +end + +function Solver._bisectToLimit(y: number, targetHue: number): { number } + local segment = Solver._bisectToSegment(y, targetHue) + local left = segment[0] + local leftHue = Solver._hueOf(left) + local right = segment[1] + for axis = 0, 3 - 1, 1 do + if left[axis] ~= right[axis] then + local lPlane = -1 + local rPlane = 255 + if left[axis] < right[axis] then + lPlane = Solver._criticalPlaneBelow(Solver._trueDelinearized(left[axis])) + rPlane = Solver._criticalPlaneAbove(Solver._trueDelinearized(right[axis])) + else + lPlane = Solver._criticalPlaneAbove(Solver._trueDelinearized(left[axis])) + rPlane = Solver._criticalPlaneBelow(Solver._trueDelinearized(right[axis])) + end + for i = 0, 8 - 1, 1 do + if math.abs(rPlane - lPlane) <= 1 then + break + else + local mPlane = math.floor((lPlane + rPlane) / 2.0) + local midPlaneCoordinate = Solver.CRITICAL_PLANES[mPlane] + local mid = Solver._setCoordinate(left, midPlaneCoordinate, right, axis) + local midHue = Solver._hueOf(mid) + if Solver._areInCyclicOrder(leftHue, targetHue, midHue) then + right = mid + rPlane = mPlane + else + left = mid + leftHue = midHue + lPlane = mPlane + end + end + end + end + end + return Solver._midpoint(left, right) +end + +function Solver._inverseChromaticAdaptation(adapted: number): number + local adaptedAbs = math.abs(adapted) + local base = math.max(0, 27.13 * adaptedAbs / (400.0 - adaptedAbs)) + return math.sign(adapted) * math.pow(base, 1.0 / 0.42) +end + +function Solver._findResultByJ(hueRadians: number, chroma: number, y: number): number + -- Initial estimate of j. + local j = math.sqrt(y) * 11.0 + -- ======================================== + -- Operations inlined from Cam16 to avoid repeated calculation + -- ======================================== + local viewingConditions = ViewingConditions.DEFAULT + local tInnerCoeff = 1 / math.pow(1.64 - math.pow(0.29, viewingConditions.n), 0.73) + local eHue = 0.25 * (math.cos(hueRadians + 2.0) + 3.8) + local p1 = eHue * (50000.0 / 13.0) * viewingConditions.nc * viewingConditions.ncb + local hSin = math.sin(hueRadians) + local hCos = math.cos(hueRadians) + for iterationRound = 0, 5 - 1, 1 do + -- ======================================== + -- Operations inlined from Cam16 to avoid repeated calculation + -- ======================================== + local jNormalized = j / 100.0 + local alpha + if chroma == 0.0 or j == 0.0 then + alpha = 0.0 + else + alpha = chroma / math.sqrt(jNormalized) + end + local t = math.pow(alpha * tInnerCoeff, 1.0 / 0.9) + local ac = viewingConditions.aw * math.pow(jNormalized, 1.0 / viewingConditions.c / viewingConditions.z) + local p2 = ac / viewingConditions.nbb + local gamma = 23.0 * (p2 + 0.305) * t / (23.0 * p1 + 11 * t * hCos + 108.0 * t * hSin) + local a = gamma * hCos + local b = gamma * hSin + local rA = (460.0 * p2 + 451.0 * a + 288.0 * b) / 1403.0 + local gA = (460.0 * p2 - 891.0 * a - 261.0 * b) / 1403.0 + local bA = (460.0 * p2 - 220.0 * a - 6300.0 * b) / 1403.0 + local rCScaled = Solver._inverseChromaticAdaptation(rA) + local gCScaled = Solver._inverseChromaticAdaptation(gA) + local bCScaled = Solver._inverseChromaticAdaptation(bA) + + local linrgb = MathUtils.matrixMultiply({ rCScaled, gCScaled, bCScaled }, Solver.LINRGB_FROM_SCALED_DISCOUNT) + -- ======================================== + -- Operations inlined from Cam16 to avoid repeated calculation + -- ======================================== + if linrgb[0] < 0 or linrgb[1] < 0 or linrgb[2] < 0 then + return 0 + end + local kR = Solver.Y_FROM_LINRGB[0] + local kG = Solver.Y_FROM_LINRGB[1] + local kB = Solver.Y_FROM_LINRGB[2] + local fnj = kR * linrgb[0] + kG * linrgb[1] + kB * linrgb[2] + if fnj <= 0 then + return 0 + end + if iterationRound == 4 or math.abs(fnj - y) < 0.002 then + if linrgb[0] > 100.01 or linrgb[1] > 100.01 or linrgb[2] > 100.01 then + return 0 + end + return ColorUtils.argbFromLinrgb(linrgb) + end + j = j - (fnj - y) * j / (2 * fnj) + end + return 0 +end + +function Solver.solveToInt(hueDegrees: number, chroma: number, lstar: number): number + if chroma < 0.0001 or lstar < 0.0001 or lstar > 99.9999 then + return ColorUtils.argbFromLstar(lstar) + end + hueDegrees = MathUtils.sanitizeDegreesDouble(hueDegrees) + local hueRadians = hueDegrees / 180 * math.pi + local y = ColorUtils.yFromLstar(lstar) + local exactAnswer = Solver._findResultByJ(hueRadians, chroma, y) + if exactAnswer ~= 0 then + return exactAnswer + end + local linrgb = Solver._bisectToLimit(y, hueRadians) + return ColorUtils.argbFromLinrgb(linrgb) +end + +function Solver.solveToCam(hueDegrees: number, chroma: number, lstar: number): Cam16 + return Cam16.fromInt(Solver.solveToInt(hueDegrees, chroma, lstar)) +end diff --git a/src/Color/HCT/init.luau b/src/Color/HCT/init.luau new file mode 100644 index 00000000..23984059 --- /dev/null +++ b/src/Color/HCT/init.luau @@ -0,0 +1,122 @@ +--!strict +-- https://github.com/material-foundation/material-color-utilities/blob/f5d03da60c268b43928f3a24d6bf499e2564d39a/typescript/hct/hct.ts +local Solver = require(script:WaitForChild("Solver")) +local Cam16 = require(script:WaitForChild("Cam16")) +local ColorUtils = require(script.Parent:WaitForChild("ColorUtils")) +local ViewingConditions = require(script.Parent:WaitForChild("ViewingConditions")) + +type ViewingConditions = ViewingConditions.ViewingConditions + +export type HCT = { + __index: HCT, + argb: number, + _internalHue: number; + _internalChroma: number; + _internalTone: number; + from: (hue: number, chroma: number, tone: number) -> HCT, + fromInt: (argb: number) -> HCT, + new: (argb: number) -> HCT, + setHue: (self: HCT, newHue: number) -> (), + setChroma: (self: HCT, newChroma: number) -> (), + setTone: (self: HCT, newTone: number) -> (), + getHue: (self: HCT) -> number, + getChroma: (self: HCT) -> number, + getTone: (self: HCT) -> number, + toInt: (self: HCT) -> number, + _setInternalState: (self: HCT, argb: number) -> (), + inViewingConditions: (self: HCT, vc: ViewingConditions) -> (), +} + +local HCT = {} :: HCT +HCT.__index = HCT + +function HCT:toInt(): number + return self.argb; +end + +function HCT:getHue(): number + return self.internalHue; +end + +function HCT:setHue(newHue: number): () + self:_setInternalState( + Solver.solveToInt( + newHue, + self._internalChroma, + self._internalTone + ) + ) +end + +function HCT:getChroma(): number + return self._internalChroma; +end + +function HCT:setChroma(newChroma: number): () + self:_setInternalState( + Solver.solveToInt( + self._internalHue, + newChroma, + self._internalTone + ) + ) +end + +function HCT:getTone(): number + return self._internalTone; +end + +function HCT:setTone(newTone: number): () + self:_setInternalState( + Solver.solveToInt( + self._internalHue, + self._internalChroma, + newTone + ) + ) +end + +function HCT:_setInternalState(argb: number) + local cam = Cam16.fromInt(argb); + self._internalHue = cam.hue; + self._internalChroma = cam.chroma; + self._internalTone = ColorUtils.lstarFromArgb(argb); + self.argb = argb; +end + +function HCT:inViewingConditions(vc: ViewingConditions): HCT + local cam = Cam16.fromInt(self:toInt()); + local viewedInVc = cam.xyzInViewingConditions(vc); + local recastInVc = Cam16.fromXyzInViewingConditions( + viewedInVc[0], + viewedInVc[1], + viewedInVc[2], + ViewingConditions.make() + ); + local recastHct = HCT.from( + recastInVc.hue, + recastInVc.chroma, + ColorUtils.lstarFromY(viewedInVc[1]) + ); + return recastHct; +end + +function HCT.new(argb: number): HCT + local cam = Cam16.fromInt(argb); + local self: HCT = setmetatable({}, HCT) :: any + self._internalHue = cam.hue; + self._internalChroma = cam.chroma; + self._internalTone = ColorUtils.lstarFromArgb(argb); + self.argb = argb; + return self +end + +function HCT.from(hue: number, chroma: number, tone: number): HCT + return HCT.new(Solver.solveToInt(hue, chroma, tone)); +end + +function HCT.fromInt(argb: number): HCT + return HCT.new(argb); +end + +return HCT \ No newline at end of file diff --git a/src/Color/MathUtils.luau b/src/Color/MathUtils.luau new file mode 100644 index 00000000..3941af59 --- /dev/null +++ b/src/Color/MathUtils.luau @@ -0,0 +1 @@ +return {} \ No newline at end of file diff --git a/src/Color/Palettes/Core.luau b/src/Color/Palettes/Core.luau new file mode 100644 index 00000000..3941af59 --- /dev/null +++ b/src/Color/Palettes/Core.luau @@ -0,0 +1 @@ +return {} \ No newline at end of file diff --git a/src/Color/Palettes/Tonal.luau b/src/Color/Palettes/Tonal.luau new file mode 100644 index 00000000..3941af59 --- /dev/null +++ b/src/Color/Palettes/Tonal.luau @@ -0,0 +1 @@ +return {} \ No newline at end of file diff --git a/src/Color/Scheme/init.luau b/src/Color/Scheme/init.luau new file mode 100644 index 00000000..3941af59 --- /dev/null +++ b/src/Color/Scheme/init.luau @@ -0,0 +1 @@ +return {} \ No newline at end of file diff --git a/src/Color/ViewingConditions.luau b/src/Color/ViewingConditions.luau new file mode 100644 index 00000000..3941af59 --- /dev/null +++ b/src/Color/ViewingConditions.luau @@ -0,0 +1 @@ +return {} \ No newline at end of file diff --git a/src/Color/init.luau b/src/Color/init.luau new file mode 100644 index 00000000..20e98cd8 --- /dev/null +++ b/src/Color/init.luau @@ -0,0 +1,101 @@ +--!strict +-- https://github.com/material-foundation/material-color-utilities/blob/f5d03da60c268b43928f3a24d6bf499e2564d39a/typescript/utils/theme_utils.ts#L77 +local Blend = require(script:WaitForChild("Blend")) +local CorePalette = require(script:WaitForChild("Palettes"):WaitForChild("Core")) +local TonalPalette = require(script:WaitForChild("Palettes"):WaitForChild("Tonal")) +local Scheme = require(script:WaitForChild("Scheme")) + +type Scheme = Scheme.Scheme +type TonalPalette = TonalPalette.TonalPalette +export type CustomColor = { + value: number, + name: string, + blend: boolean, +} + +export type ColorGroup = { + color: number, + onColor: number, + colorContainer: number, + onColorContainer: number, +} + +export type CustomColorGroup = { + color: CustomColor, + value: number, + light: ColorGroup, + dark: ColorGroup, +} + +export type Theme = { + source: number, + schemes: { light: Scheme, dark: Scheme }, + palettes: { + primary: TonalPalette, + secondary: TonalPalette, + tertiary: TonalPalette, + neutral: TonalPalette, + neutralVariant: TonalPalette, + error: TonalPalette, + }, + customColors: { CustomColorGroup }, +} + +local Util = {} + +-- Generate a theme from a source color +function Util.themeFromSourceColor(source: number, customColors: { CustomColor }): Theme + local palette = CorePalette.of(source) + return { + source = source, + schemes = { + light = Scheme.light(source), + dark = Scheme.dark(source), + }, + palettes = { + primary = palette.a1, + secondary = palette.a2, + tertiary = palette.a3, + neutral = palette.n1, + neutralVariant = palette.n2, + error = palette.error, + }, + customColors = (function(): { CustomColorGroup } + local out: { CustomColorGroup } = {} + for i, c in ipairs(customColors) do + out[i] = Util.customColor(source, c) + end + return out + end)(), + } +end + +-- Generate custom color group from source and target color +function Util.customColor(source: number, color: CustomColor): CustomColorGroup + local value = color.value + local from = value + local to = source + if color.blend then + value = Blend.harmonize(from, to) + end + local palette = CorePalette.of(value) + local tones = palette.a1 + return { + color = color, + value = value, + light = { + color = tones.tone(40), + onColor = tones.tone(100), + colorContainer = tones.tone(90), + onColorContainer = tones.tone(10), + }, + dark = { + color = tones.tone(80), + onColor = tones.tone(20), + colorContainer = tones.tone(30), + onColorContainer = tones.tone(90), + }, + } +end + +return Util diff --git a/src/Component/Bar/Top/Center/init.luau b/src/Component/Bar/Top/Center/init.luau index 689751ff..4ae123e6 100644 --- a/src/Component/Bar/Top/Center/init.luau +++ b/src/Component/Bar/Top/Center/init.luau @@ -16,10 +16,7 @@ type Maid = Maid.Maid type State = ColdFusion.State type ValueState = ColdFusion.ValueState type CanBeState = ColdFusion.CanBeState -type TextStyle = Types.TextStyle -type ToggleTextStyle = Types.ToggleTextStyle type ImageData = Types.ImageData -type ThemeData = Types.ThemeData type OptionData = Types.OptionData type ButtonData = Types.ButtonData -- Constants diff --git a/src/Component/Button/Base.luau b/src/Component/Button/Base.luau index 4c551f1f..c807870a 100644 --- a/src/Component/Button/Base.luau +++ b/src/Component/Button/Base.luau @@ -19,9 +19,8 @@ type Maid = Maid.Maid type State = ColdFusion.State type ValueState = ColdFusion.ValueState type CanBeState = ColdFusion.CanBeState -type TextStyle = Types.TextStyle type ImageData = Types.ImageData -type ThemeData = Types.ThemeData +type Style = Types.Style -- Constants local HEIGHT_DP = 40 local SHAPE_DP = 20 @@ -40,12 +39,10 @@ return function( onClick: CanBeState<() -> ()>, text: CanBeState, font: CanBeState, - styles: CanBeState<{ [Enums.ButtonStateType]: TextStyle }>, + styles: CanBeState<{ [Enums.ButtonStateType]: Style }>, textIcon: CanBeState, isEnabled: CanBeState, isDropShadow: CanBeState, - scale: CanBeState, - sound: CanBeState, hasMinimumSize: CanBeState?, cornerRadius: CanBeState?, paddingScale: CanBeState?, @@ -97,7 +94,7 @@ return function( local stylesState = _import(styles, {}) :: any local currentStyleState = _Computed( - function(state: Enums.ButtonStateType, styles: { [Enums.ButtonStateType]: TextStyle }): TextStyle + function(state: Enums.ButtonStateType, styles: { [Enums.ButtonStateType]: Style }): Style local style = styles[state] assert(style ~= nil, `no style for {state}`) return style @@ -105,13 +102,28 @@ return function( currentStateState, stylesState ) + local sound = _new("Sound")({ + SoundId = _Computed(function(st: Style): string + return st.SoundId + end, currentStyleState), + Volume = _Computed(function(st: Style): number + return st.SoundVolume + end, currentStyleState) + }) :: Sound + currentStyleState:Connect(function() + task.wait() + SoundService:PlayLocalSound(sound) + end) + + local scaleState = _Computed(function(st: Style): number + return st.Scale + end, currentStyleState) local onClickState = _import(onClick, function() end) local textState = _import(text, "") local fontState = _import(font, Font.fromEnum(Enum.Font.SourceSansSemibold)) - local scaleState = _import(scale, 1) local iconState = _import(textIcon, nil :: ImageData?) :: any - local soundState = _import(sound, nil :: Sound?) + local isDropShadowState = _import(isDropShadow, false) local hasMinState = _import(hasMinimumSize, true) local cornerRadiusState = _import(cornerRadius, SHAPE_DP) @@ -144,7 +156,7 @@ return function( Enum.EasingDirection.In ) - local baseColor = (stylesState:Get()[Enums.ButtonStateType.Enabled] :: TextStyle).BackgroundColor3 + local baseColor = (stylesState:Get()[Enums.ButtonStateType.Enabled] :: Style).BackgroundColor3 local rippleColor = (Color3.new(1, 1, 1):Lerp(baseColor, 0.8)):Lerp(baseColor, fadeAlpha) local leftOffset = @@ -187,7 +199,7 @@ return function( Image = "rbxassetid://15549395120", ImageColor3 = Color3.new(0, 0, 0), BackgroundTransparency = 1, - ImageTransparency = _Computed(function(style: TextStyle, isDrop: boolean): number + ImageTransparency = _Computed(function(style: Style, isDrop: boolean): number return if style.BackgroundTransparency == 0 and isDrop then 0 else 1 end, currentStyleState, isDropShadowState), ScaleType = Enum.ScaleType.Slice, @@ -209,10 +221,10 @@ return function( _new("TextButton")({ Name = "TextButton", Text = "", - BackgroundTransparency = _Computed(function(style: TextStyle): number + BackgroundTransparency = _Computed(function(style: Style): number return style.BackgroundTransparency end, currentStyleState), - BackgroundColor3 = _Computed(function(style: TextStyle, useRip: boolean): Color3 + BackgroundColor3 = _Computed(function(style: Style, useRip: boolean): Color3 if useRip then return Color3.new(1, 1, 1) end @@ -229,10 +241,6 @@ return function( return end local click = onClickState:Get() - local s = soundState:Get() - if s then - SoundService:PlayLocalSound(s) - end click() end, MouseButton1Down = function(x: number, y: number) @@ -271,7 +279,7 @@ return function( }), _new("UIGradient")({ Color = _Computed( - function(useRip: boolean, style: TextStyle, seq: ColorSequence?): ColorSequence + function(useRip: boolean, style: Style, seq: ColorSequence?): ColorSequence if useRip then if seq then return seq @@ -289,14 +297,14 @@ return function( }), _new("UIStroke")({ ApplyStrokeMode = Enum.ApplyStrokeMode.Border, - Color = _Computed(function(style: TextStyle): Color3 + Color = _Computed(function(style: Style): Color3 return style.BorderColor3 end, currentStyleState), LineJoinMode = Enum.LineJoinMode.Round, Thickness = _Computed(function(s: number): number return math.max(s * 1, 1) end, scaleState), - Transparency = _Computed(function(style: TextStyle): number + Transparency = _Computed(function(style: Style): number return style.BorderTransparency end, currentStyleState), }), @@ -322,10 +330,10 @@ return function( AutomaticSize = Enum.AutomaticSize.X, FontFace = fontState, LayoutOrder = 2, - TextColor3 = _Computed(function(style: TextStyle): Color3 + TextColor3 = _Computed(function(style: Style): Color3 return style.TextColor3 end, currentStyleState), - TextTransparency = _Computed(function(style: TextStyle): number + TextTransparency = _Computed(function(style: Style): number return style.TextTransparency end, currentStyleState), Size = _Computed(function(s: number): UDim2 @@ -342,7 +350,7 @@ return function( Image = _Computed(function(icon: ImageData?): string return if icon then icon.Image else "" end, iconState), - ImageColor3 = _Computed(function(icon: ImageData?, style: TextStyle?): Color3 + ImageColor3 = _Computed(function(icon: ImageData?, style: Style?): Color3 return if icon and style then style.TextColor3 else Color3.new(1, 1, 1) end, iconState, currentStyleState), ImageRectOffset = _Computed(function(icon: ImageData?): Vector2 @@ -351,7 +359,7 @@ return function( ImageRectSize = _Computed(function(icon: ImageData?): Vector2 return if icon then icon.ImageRectSize else Vector2.zero end, iconState), - ImageTransparency = _Computed(function(icon: ImageData?, style: TextStyle?): number + ImageTransparency = _Computed(function(icon: ImageData?, style: Style?): number return if icon and style then style.TextTransparency else 1 end, iconState, currentStyleState), SizeConstraint = Enum.SizeConstraint.RelativeYY, diff --git a/src/Component/Button/TextButton/init.luau b/src/Component/Button/TextButton/init.luau index 296807c0..2e6cb778 100644 --- a/src/Component/Button/TextButton/init.luau +++ b/src/Component/Button/TextButton/init.luau @@ -20,9 +20,8 @@ type Maid = Maid.Maid type State = ColdFusion.State type ValueState = ColdFusion.ValueState type CanBeState = ColdFusion.CanBeState -type TextStyle = Types.TextStyle +type TextStyle = Types.Style type ImageData = Types.ImageData -type ThemeData = Types.ThemeData -- Constants local DEFAULT_VOLUME = Config.Sound.Volume local HOVER_TRANSPARENCY = Config.Transparency.Background.Hovered @@ -40,7 +39,7 @@ local Interface = {} function Interface.cfusion( onClick: CanBeState<() -> ()>, text: CanBeState, - theme: CanBeState, + styles: CanBeState<{ [Enums.ButtonStateType]: Style }>, icon: CanBeState?, isEnabled: CanBeState? ): ImageLabel @@ -58,20 +57,6 @@ function Interface.cfusion( local onClickState = _import(onClick, function() end) local textState = _import(text, "") - local themeState = _import( - theme, - Types.newThemeData( - 1, - false, - 1, - Font.fromEnum(Enum.Font.SourceSansSemibold), - Color3.fromHSV(0.8, 0.4, 0.8) - ) - ) - - local sound = maid:GiveTask(Instance.new("Sound")) - sound.Volume = DEFAULT_VOLUME - sound.SoundId = Sounds.ui_tap_variant_01 local styles = _Computed(function(thm: ThemeData): { [Enums.ButtonStateType]: TextStyle } local textColor: Color3? diff --git a/src/Types.luau b/src/Types.luau index c37b53f9..c6da04f1 100644 --- a/src/Types.luau +++ b/src/Types.luau @@ -3,40 +3,32 @@ -- Packages -- Modules -- Types -export type ThemeData = { - Elevation: number, - IsDarkMode: boolean, - Color3: Color3, - SelectionColor3: Color3, - Font: Font, - BackgroundColor3: Color3?, - Scale: number, -} -export type ImageData = { - Image: string, - ImageRectOffset: Vector2, - ImageRectSize: Vector2, -} export type Style = { + Scale: number, + Font: Font, + TextColor3: Color3, + TextTransparency: number, BorderColor3: Color3, BorderTransparency: number, BackgroundColor3: Color3, BackgroundTransparency: number, + SoundId: string, + SoundVolume: number, } -export type TextStyle = { - TextColor3: Color3, - TextTransparency: number, -} & Style -export type ToggleTextStyle = { - Selected: TextStyle, - Unselected: TextStyle, + +export type ImageData = { + Image: string, + ImageRectOffset: Vector2, + ImageRectSize: Vector2, } + export type ButtonData = { Icon: ImageData?, Text: string?, Enabled: boolean, OnClick: () -> () } + export type OptionData = { Text: string, Icon: ImageData?, @@ -96,61 +88,28 @@ function Types.newImageData(image: string, rectOffset: Vector2?, rectSize: Vecto end function Types.newStyle( - backgroundColor3: Color3, - backgroundTransparency: number, - borderColor3: Color3, - borderTransparency: number -): Style - return { - BackgroundColor3 = backgroundColor3, - BackgroundTransparency = backgroundTransparency, - BorderColor3 = borderColor3, - BorderTransparency = borderTransparency, - } -end - -function Types.newTextStyle( - textColor3: Color3, - textTransparency: number, - backgroundColor: Color3, - backgroundTransparency: number, - borderColor3: Color3, - borderTransparency: number -): TextStyle - return { - TextColor3 = textColor3, - TextTransparency = textTransparency, - BackgroundColor3 = backgroundColor, - BackgroundTransparency = backgroundTransparency, - BorderColor3 = borderColor3, - BorderTransparency = borderTransparency, - } -end - -function Types.newToggleTextStyle(selected: TextStyle, unselected: TextStyle): ToggleTextStyle - return { - Selected = selected, - Unselected = unselected, - } -end - -function Types.newThemeData( - elevation: number, - isDarkMode: boolean, - scale: number, - font: Font, - color3: Color3, + scale: number?, + font: Font?, + textColor3: Color3?, + textTransparency: number?, + borderColor3: Color3?, + borderTransparency: number?, backgroundColor3: Color3?, - selectionColor3: Color3? -): ThemeData + backgroundTransparency: number?, + soundId: string?, + soundVolume: number? +): Style return { - Color3 = color3, - SelectionColor3 = selectionColor3 or color3, - BackgroundColor3 = backgroundColor3, - Elevation = elevation, - IsDarkMode = isDarkMode, - Font = font, - Scale = scale, + Scale = scale or 1, + Font = font or Font.fromEnum(Enum.Font.SourceSans), + TextColor3 = textColor3 or Color3.new(0.15,0.15,0.15), + TextTransparency = textTransparency or 0, + BorderColor3 = borderColor3 or Color3.new(0.15,0.15,0.15), + BorderTransparency = borderTransparency or 0, + BackgroundColor3 = backgroundColor3 or Color3.new(0.85,0.85,0.85), + BackgroundTransparency = backgroundTransparency or 0, + SoundId = soundId or "", + SoundVolume = soundVolume or 0, } end diff --git a/src/init.luau b/src/init.luau index 5ac37713..b871b2cd 100644 --- a/src/init.luau +++ b/src/init.luau @@ -9,11 +9,8 @@ local Util = require(ReplicatedStorage.Packages.synthetic.Util) local Types = require(_Package:WaitForChild("Types")) -- Types -export type ThemeData = Types.ThemeData export type ImageData = Types.ImageData export type Style = Types.Style -export type TextStyle = Types.TextStyle -export type ToggleTextStyle = Types.ToggleTextStyle export type OptionData = Types.OptionData -- Constants -- Variables diff --git a/stylua.toml b/stylua.toml index 55c91d6e..720ba21d 100644 --- a/stylua.toml +++ b/stylua.toml @@ -1,4 +1,4 @@ -column_width = 110 +column_width = 150 line_endings = "Unix" indent_type = "Tabs" indent_width = 3 From cdde94f699464021b6e1a8684dfee90b5ca49bd2 Mon Sep 17 00:00:00 2001 From: Nightcycle <77173389+nightcycle@users.noreply.github.com> Date: Thu, 7 Dec 2023 18:36:26 -0500 Subject: [PATCH 19/57] first version of theme generator --- sourcemap.json | 2 +- src/Color/Blend.luau | 48 --- src/Color/ColorUtils.luau | 1 - src/Color/MathUtils.luau | 1 - src/Color/Palettes/Core.luau | 1 - src/Color/Palettes/Tonal.luau | 1 - src/Color/Scheme/init.luau | 1 - src/Color/ViewingConditions.luau | 1 - src/Theme/Blend.luau | 45 +++ src/Theme/ColorUtil.luau | 242 ++++++++++++++ src/{Color => Theme}/HCT/Cam16.luau | 20 +- src/{Color => Theme}/HCT/Solver.luau | 149 ++++++--- src/{Color => Theme}/HCT/init.luau | 85 ++--- src/Theme/MathUtil.luau | 76 +++++ src/Theme/Palettes/Core.luau | 97 ++++++ src/Theme/Palettes/Tonal.luau | 98 ++++++ src/Theme/Scheme/init.luau | 149 +++++++++ src/Theme/Test.story.luau | 59 ++++ src/{Color/init.luau => Theme/ThemeUtil.luau} | 44 ++- src/Theme/ViewingConditions.luau | 120 +++++++ src/Theme/init.luau | 307 ++++++++++++++++++ 21 files changed, 1362 insertions(+), 185 deletions(-) delete mode 100644 src/Color/Blend.luau delete mode 100644 src/Color/ColorUtils.luau delete mode 100644 src/Color/MathUtils.luau delete mode 100644 src/Color/Palettes/Core.luau delete mode 100644 src/Color/Palettes/Tonal.luau delete mode 100644 src/Color/Scheme/init.luau delete mode 100644 src/Color/ViewingConditions.luau create mode 100644 src/Theme/Blend.luau create mode 100644 src/Theme/ColorUtil.luau rename src/{Color => Theme}/HCT/Cam16.luau (96%) rename src/{Color => Theme}/HCT/Solver.luau (86%) rename src/{Color => Theme}/HCT/init.luau (54%) create mode 100644 src/Theme/MathUtil.luau create mode 100644 src/Theme/Palettes/Core.luau create mode 100644 src/Theme/Palettes/Tonal.luau create mode 100644 src/Theme/Scheme/init.luau create mode 100644 src/Theme/Test.story.luau rename src/{Color/init.luau => Theme/ThemeUtil.luau} (64%) create mode 100644 src/Theme/ViewingConditions.luau create mode 100644 src/Theme/init.luau diff --git a/sourcemap.json b/sourcemap.json index 0aa4ebba..17ef67c6 100644 --- a/sourcemap.json +++ b/sourcemap.json @@ -1 +1 @@ -{"name":"synthetic-test","className":"DataModel","filePaths":["dev.project.json"],"children":[{"name":"ReplicatedStorage","className":"ReplicatedStorage","children":[{"name":"Packages","className":"Folder","children":[{"name":"ColdFusion","className":"ModuleScript","filePaths":["Packages\\ColdFusion.lua"]},{"name":"CurveUtil","className":"ModuleScript","filePaths":["Packages\\CurveUtil.lua"]},{"name":"Format","className":"ModuleScript","filePaths":["Packages\\Format.lua"]},{"name":"Fusion","className":"ModuleScript","filePaths":["Packages\\Fusion.lua"]},{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\Maid.lua"]},{"name":"MaterialIcons","className":"ModuleScript","filePaths":["Packages\\MaterialIcons.lua"]},{"name":"MeshUtil","className":"ModuleScript","filePaths":["Packages\\MeshUtil.lua"]},{"name":"Roact","className":"ModuleScript","filePaths":["Packages\\Roact.lua"]},{"name":"Signal","className":"ModuleScript","filePaths":["Packages\\Signal.lua"]},{"name":"TableUtil","className":"ModuleScript","filePaths":["Packages\\TableUtil.lua"]},{"name":"_Index","className":"Folder","children":[{"name":"elttob_fusion@0.2.0","className":"Folder","children":[{"name":"fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\init.lua","Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\default.project.json"],"children":[{"name":"Animation","className":"Folder","children":[{"name":"Spring","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\Spring.lua"]},{"name":"SpringScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\SpringScheduler.lua"]},{"name":"Tween","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\Tween.lua"]},{"name":"TweenScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\TweenScheduler.lua"]},{"name":"getTweenRatio","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\getTweenRatio.lua"]},{"name":"lerpType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\lerpType.lua"]},{"name":"packType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\packType.lua"]},{"name":"springCoefficients","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\springCoefficients.lua"]},{"name":"unpackType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\unpackType.lua"]}]},{"name":"Colour","className":"Folder","children":[{"name":"Oklab","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Colour\\Oklab.lua"]}]},{"name":"Dependencies","className":"Folder","children":[{"name":"captureDependencies","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\captureDependencies.lua"]},{"name":"initDependency","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\initDependency.lua"]},{"name":"sharedState","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\sharedState.lua"]},{"name":"updateAll","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\updateAll.lua"]},{"name":"useDependency","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\useDependency.lua"]}]},{"name":"Instances","className":"Folder","children":[{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Children.lua"]},{"name":"Cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Cleanup.lua"]},{"name":"Hydrate","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Hydrate.lua"]},{"name":"New","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\New.lua"]},{"name":"OnChange","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\OnChange.lua"]},{"name":"OnEvent","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\OnEvent.lua"]},{"name":"Out","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Out.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Ref.lua"]},{"name":"applyInstanceProps","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\applyInstanceProps.lua"]},{"name":"defaultProps","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\defaultProps.lua"]}]},{"name":"Logging","className":"Folder","children":[{"name":"logError","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logError.lua"]},{"name":"logErrorNonFatal","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logErrorNonFatal.lua"]},{"name":"logWarn","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logWarn.lua"]},{"name":"messages","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\messages.lua"]},{"name":"parseError","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\parseError.lua"]}]},{"name":"PubTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\PubTypes.lua"]},{"name":"State","className":"Folder","children":[{"name":"Computed","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Computed.lua"]},{"name":"ForKeys","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForKeys.lua"]},{"name":"ForPairs","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForPairs.lua"]},{"name":"ForValues","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForValues.lua"]},{"name":"Observer","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Observer.lua"]},{"name":"Value","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Value.lua"]},{"name":"unwrap","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\unwrap.lua"]}]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Types.lua"]},{"name":"Utility","className":"Folder","children":[{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\None.lua"]},{"name":"cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\cleanup.lua"]},{"name":"doNothing","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\doNothing.lua"]},{"name":"isSimilar","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\isSimilar.lua"]},{"name":"needsDestruction","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\needsDestruction.lua"]},{"name":"restrictRead","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\restrictRead.lua"]},{"name":"xtypeof","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\xtypeof.lua"]}]}]}]},{"name":"nightcycle_cold-fusion@9.0.7","className":"Folder","children":[{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\Maid.lua"]},{"name":"ServiceProxy","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\ServiceProxy.lua"]},{"name":"Signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\Signal.lua"]},{"name":"TableUtil","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\TableUtil.lua"]},{"name":"cold-fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\init.luau","Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\default.project.json"],"children":[{"name":"Fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\init.lua"],"children":[{"name":"Animation","className":"Folder","children":[{"name":"Spring","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\Spring.lua"]},{"name":"SpringScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\SpringScheduler.lua"]},{"name":"Tween","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\Tween.lua"]},{"name":"TweenScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\TweenScheduler.lua"]},{"name":"getTweenRatio","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\getTweenRatio.lua"]},{"name":"lerpType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\lerpType.lua"]},{"name":"packType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\packType.lua"]},{"name":"springCoefficients","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\springCoefficients.lua"]},{"name":"unpackType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\unpackType.lua"]}]},{"name":"Colour","className":"Folder","children":[{"name":"Oklab","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Colour\\Oklab.lua"]}]},{"name":"Instances","className":"Folder","children":[{"name":"Attribute","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Attribute.lua"]},{"name":"AttributeChange","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\AttributeChange.lua"]},{"name":"AttributeOut","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\AttributeOut.lua"]},{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Children.lua"]},{"name":"Cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Cleanup.lua"]},{"name":"Hydrate","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Hydrate.lua"]},{"name":"New","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\New.lua"]},{"name":"OnChange","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\OnChange.lua"]},{"name":"OnEvent","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\OnEvent.lua"]},{"name":"Out","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Out.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Ref.lua"]},{"name":"applyInstanceProps","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\applyInstanceProps.lua"]},{"name":"defaultProps","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\defaultProps.lua"]}]},{"name":"Logging","className":"Folder","children":[{"name":"logError","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logError.lua"]},{"name":"logErrorNonFatal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logErrorNonFatal.lua"]},{"name":"logWarn","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logWarn.lua"]},{"name":"messages","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\messages.lua"]},{"name":"parseError","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\parseError.lua"]}]},{"name":"PubTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\PubTypes.lua"]},{"name":"State","className":"Folder","children":[{"name":"Computed","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Computed.lua"]},{"name":"ForKeys","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForKeys.lua"]},{"name":"ForPairs","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForPairs.lua"]},{"name":"ForValues","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForValues.lua"]},{"name":"Observer","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Observer.lua"]},{"name":"Value","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Value.lua"]},{"name":"isState","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\isState.lua"]},{"name":"makeUseCallback","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\makeUseCallback.lua"]},{"name":"peek","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\peek.lua"]},{"name":"updateAll","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\updateAll.lua"]}]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Types.lua"]},{"name":"Utility","className":"Folder","children":[{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\None.lua"]},{"name":"cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\cleanup.lua"]},{"name":"doNothing","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\doNothing.lua"]},{"name":"isSimilar","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\isSimilar.lua"]},{"name":"needsDestruction","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\needsDestruction.lua"]},{"name":"restrictRead","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\restrictRead.lua"]},{"name":"xtypeof","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\xtypeof.lua"]}]}]},{"name":"InstanceTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\InstanceTypes.luau"]},{"name":"Interface","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Interface.luau"]},{"name":"Test.story","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Test.story.luau"]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Types.luau"]},{"name":"Util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Util.luau"]}]}]},{"name":"nightcycle_curve-util@1.0.0","className":"Folder","children":[{"name":"Vector","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\Vector.lua"]},{"name":"curve-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\init.lua","Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\default.project.json"],"children":[{"name":"Ease","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\Ease.lua"]},{"name":"Lerp","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\Lerp.lua"]}]}]},{"name":"nightcycle_format@0.1.3","className":"Folder","children":[{"name":"format","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\init.lua","Packages\\_Index\\nightcycle_format@0.1.3\\format\\default.project.json"],"children":[{"name":"Emoji","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\Emoji.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\init.spec.lua"]}]},{"name":"maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\maid.lua"]},{"name":"signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\signal.lua"]},{"name":"string","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\string.lua"]}]},{"name":"nightcycle_geometry-util@1.1.1","className":"Folder","children":[{"name":"geometry-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\init.lua","Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\default.project.json"],"children":[{"name":"Earcut","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\Earcut\\init.lua"],"children":[{"name":"ZeroArray","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\Earcut\\ZeroArray.lua"]}]}]}]},{"name":"nightcycle_maid@1.1.4","className":"Folder","children":[{"name":"maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\init.lua","Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\default.project.json"],"children":[{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\Maid.lua"]},{"name":"MaidTaskUtils","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\MaidTaskUtils.lua"]}]}]},{"name":"nightcycle_material-icons@1.0.1","className":"Folder","children":[{"name":"material-icons","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\init.luau","Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\default.project.json"],"children":[{"name":"Default_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_1.luau"]},{"name":"Default_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_2.luau"]},{"name":"Default_18_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_3.luau"]},{"name":"Default_18_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_4.luau"]},{"name":"Default_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_1.luau"]},{"name":"Default_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_2.luau"]},{"name":"Default_24_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_3.luau"]},{"name":"Default_24_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_4.luau"]},{"name":"Default_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_1.luau"]},{"name":"Default_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_2.luau"]},{"name":"Default_36_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_3.luau"]},{"name":"Default_36_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_4.luau"]},{"name":"Default_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_1.luau"]},{"name":"Default_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_2.luau"]},{"name":"Default_48_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_3.luau"]},{"name":"Default_48_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_4.luau"]},{"name":"Outlined_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_18_1.luau"]},{"name":"Outlined_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_18_2.luau"]},{"name":"Outlined_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_24_1.luau"]},{"name":"Outlined_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_24_2.luau"]},{"name":"Outlined_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_36_1.luau"]},{"name":"Outlined_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_36_2.luau"]},{"name":"Outlined_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_48_1.luau"]},{"name":"Outlined_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_48_2.luau"]},{"name":"Round_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_18_1.luau"]},{"name":"Round_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_18_2.luau"]},{"name":"Round_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_24_1.luau"]},{"name":"Round_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_24_2.luau"]},{"name":"Round_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_36_1.luau"]},{"name":"Round_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_36_2.luau"]},{"name":"Round_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_48_1.luau"]},{"name":"Round_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_48_2.luau"]},{"name":"Sharp_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_18_1.luau"]},{"name":"Sharp_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_18_2.luau"]},{"name":"Sharp_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_24_1.luau"]},{"name":"Sharp_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_24_2.luau"]},{"name":"Sharp_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_36_1.luau"]},{"name":"Sharp_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_36_2.luau"]},{"name":"Sharp_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_48_1.luau"]},{"name":"Sharp_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_48_2.luau"]},{"name":"TwoTone_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_18_1.luau"]},{"name":"TwoTone_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_18_2.luau"]},{"name":"TwoTone_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_24_1.luau"]},{"name":"TwoTone_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_24_2.luau"]},{"name":"TwoTone_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_36_1.luau"]},{"name":"TwoTone_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_36_2.luau"]},{"name":"TwoTone_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_48_1.luau"]},{"name":"TwoTone_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_48_2.luau"]}]}]},{"name":"nightcycle_mesh-util@1.0.3","className":"Folder","children":[{"name":"GeometryUtil","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\GeometryUtil.lua"]},{"name":"mesh-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\init.lua","Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\default.project.json"],"children":[{"name":"CornerWedgePart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\CornerWedgePart.lua"]},{"name":"Part","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\Part.lua"]},{"name":"TetraPart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\TetraPart.lua"]},{"name":"WedgePart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\WedgePart.lua"]}]}]},{"name":"nightcycle_service-proxy@1.0.0","className":"Folder","children":[{"name":"service-proxy","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_service-proxy@1.0.0\\service-proxy\\src\\init.lua","Packages\\_Index\\nightcycle_service-proxy@1.0.0\\service-proxy\\default.project.json"]}]},{"name":"nightcycle_signal@1.0.2","className":"Folder","children":[{"name":"signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_signal@1.0.2\\signal\\src\\init.lua","Packages\\_Index\\nightcycle_signal@1.0.2\\signal\\default.project.json"]}]},{"name":"nightcycle_string@0.1.0","className":"Folder","children":[{"name":"string","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_string@0.1.0\\string\\src\\init.lua","Packages\\_Index\\nightcycle_string@0.1.0\\string\\default.project.json"],"children":[{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_string@0.1.0\\string\\src\\init.spec.lua"]}]}]},{"name":"nightcycle_table-util@1.1.0","className":"Folder","children":[{"name":"table-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_table-util@1.1.0\\table-util\\src\\init.lua","Packages\\_Index\\nightcycle_table-util@1.1.0\\table-util\\default.project.json"]}]},{"name":"nightcycle_vector@1.0.2","className":"Folder","children":[{"name":"vector","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_vector@1.0.2\\vector\\src\\init.lua","Packages\\_Index\\nightcycle_vector@1.0.2\\vector\\default.project.json"]}]},{"name":"roblox_roact@1.4.4","className":"Folder","children":[{"name":"roact","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\init.lua","Packages\\_Index\\roblox_roact@1.4.4\\roact\\default.project.json"],"children":[{"name":"Binding","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Binding.lua"]},{"name":"Binding.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Binding.spec.lua"]},{"name":"Component","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.lua"]},{"name":"Component.spec","className":"Folder","children":[{"name":"context.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\context.spec.lua"]},{"name":"defaultProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\defaultProps.spec.lua"]},{"name":"didMount.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\didMount.spec.lua"]},{"name":"didUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\didUpdate.spec.lua"]},{"name":"extend.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\extend.spec.lua"]},{"name":"getDerivedStateFromProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\getDerivedStateFromProps.spec.lua"]},{"name":"getElementTraceback.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\getElementTraceback.spec.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\init.spec.lua"]},{"name":"legacyContext.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\legacyContext.spec.lua"]},{"name":"render.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\render.spec.lua"]},{"name":"setState.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\setState.spec.lua"]},{"name":"shouldUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\shouldUpdate.spec.lua"]},{"name":"validateProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\validateProps.spec.lua"]},{"name":"willUnmount.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\willUnmount.spec.lua"]},{"name":"willUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\willUpdate.spec.lua"]}]},{"name":"ComponentLifecyclePhase","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ComponentLifecyclePhase.lua"]},{"name":"Config","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Config.lua"]},{"name":"Config.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Config.spec.lua"]},{"name":"ElementKind","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementKind.lua"]},{"name":"ElementKind.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementKind.spec.lua"]},{"name":"ElementUtils","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementUtils.lua"]},{"name":"ElementUtils.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementUtils.spec.lua"]},{"name":"GlobalConfig","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\GlobalConfig.lua"]},{"name":"GlobalConfig.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\GlobalConfig.spec.lua"]},{"name":"Logging","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Logging.lua"]},{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\None.lua"]},{"name":"NoopRenderer","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\NoopRenderer.lua"]},{"name":"Portal","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Portal.lua"]},{"name":"PropMarkers","className":"Folder","children":[{"name":"Change","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Change.lua"]},{"name":"Change.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Change.spec.lua"]},{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Children.lua"]},{"name":"Event","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Event.lua"]},{"name":"Event.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Event.spec.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Ref.lua"]}]},{"name":"PureComponent","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PureComponent.lua"]},{"name":"PureComponent.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PureComponent.spec.lua"]},{"name":"RobloxRenderer","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\RobloxRenderer.lua"]},{"name":"RobloxRenderer.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\RobloxRenderer.spec.lua"]},{"name":"SingleEventManager","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\SingleEventManager.lua"]},{"name":"SingleEventManager.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\SingleEventManager.spec.lua"]},{"name":"Symbol","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Symbol.lua"]},{"name":"Symbol.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Symbol.spec.lua"]},{"name":"Type","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Type.lua"]},{"name":"Type.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Type.spec.lua"]},{"name":"assertDeepEqual","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assertDeepEqual.lua"]},{"name":"assertDeepEqual.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assertDeepEqual.spec.lua"]},{"name":"assign","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assign.lua"]},{"name":"assign.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assign.spec.lua"]},{"name":"createContext","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createContext.lua"]},{"name":"createContext.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createContext.spec.lua"]},{"name":"createElement","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createElement.lua"]},{"name":"createElement.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createElement.spec.lua"]},{"name":"createFragment","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createFragment.lua"]},{"name":"createFragment.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createFragment.spec.lua"]},{"name":"createReconciler","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconciler.lua"]},{"name":"createReconciler.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconciler.spec.lua"]},{"name":"createReconcilerCompat","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconcilerCompat.lua"]},{"name":"createReconcilerCompat.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconcilerCompat.spec.lua"]},{"name":"createRef","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createRef.lua"]},{"name":"createRef.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createRef.spec.lua"]},{"name":"createSignal","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSignal.lua"]},{"name":"createSignal.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSignal.spec.lua"]},{"name":"createSpy","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSpy.lua"]},{"name":"createSpy.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSpy.spec.lua"]},{"name":"forwardRef","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\forwardRef.lua"]},{"name":"forwardRef.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\forwardRef.spec.lua"]},{"name":"getDefaultInstanceProperty","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\getDefaultInstanceProperty.lua"]},{"name":"getDefaultInstanceProperty.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\getDefaultInstanceProperty.spec.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\init.spec.lua"]},{"name":"internalAssert","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\internalAssert.lua"]},{"name":"invalidSetStateMessages","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\invalidSetStateMessages.lua"]},{"name":"oneChild","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\oneChild.lua"]},{"name":"oneChild.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\oneChild.spec.lua"]},{"name":"strict","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\strict.lua"]},{"name":"strict.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\strict.spec.lua"]}]}]}]},{"name":"synthetic","className":"ModuleScript","filePaths":["src\\init.luau"],"children":[{"name":"Color","className":"ModuleScript","filePaths":["src\\Color\\init.luau"],"children":[{"name":"Blend","className":"ModuleScript","filePaths":["src\\Color\\Blend.luau"]},{"name":"ColorUtils","className":"ModuleScript","filePaths":["src\\Color\\ColorUtils.luau"]},{"name":"HCT","className":"ModuleScript","filePaths":["src\\Color\\HCT\\init.luau"],"children":[{"name":"Cam16","className":"ModuleScript","filePaths":["src\\Color\\HCT\\Cam16.luau"]},{"name":"Solver","className":"ModuleScript","filePaths":["src\\Color\\HCT\\Solver.luau"]}]},{"name":"MathUtils","className":"ModuleScript","filePaths":["src\\Color\\MathUtils.luau"]},{"name":"Palettes","className":"Folder","children":[{"name":"Core","className":"ModuleScript","filePaths":["src\\Color\\Palettes\\Core.luau"]},{"name":"Tonal","className":"ModuleScript","filePaths":["src\\Color\\Palettes\\Tonal.luau"]}]},{"name":"Scheme","className":"ModuleScript","filePaths":["src\\Color\\Scheme\\init.luau"]},{"name":"ViewingConditions","className":"ModuleScript","filePaths":["src\\Color\\ViewingConditions.luau"]}]},{"name":"Component","className":"Folder","children":[{"name":"Bar","className":"Folder","children":[{"name":"Bottom","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Bottom\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Bottom\\cfusion.story.luau"]}]},{"name":"Top","className":"Folder","children":[{"name":"Base","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Base.luau"]},{"name":"Center","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Center\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Center\\cfusion.story.luau"]}]},{"name":"Large","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Large\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Large\\cfusion.story.luau"]}]},{"name":"Medium","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Medium\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Medium\\cfusion.story.luau"]}]},{"name":"Small","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Small\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Small\\cfusion.story.luau"]}]}]}]},{"name":"Button","className":"Folder","children":[{"name":"Badge","className":"ModuleScript","filePaths":["src\\Component\\Button\\Badge\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\Badge\\cfusion.story.luau"]}]},{"name":"Base","className":"ModuleScript","filePaths":["src\\Component\\Button\\Base.luau"]},{"name":"ElevatedButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\ElevatedButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\ElevatedButton\\cfusion.story.luau"]}]},{"name":"ExtendedFAB","className":"ModuleScript","filePaths":["src\\Component\\Button\\ExtendedFAB\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\ExtendedFAB\\cfusion.story.luau"]}]},{"name":"FAB","className":"ModuleScript","filePaths":["src\\Component\\Button\\FAB\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\FAB\\cfusion.story.luau"]}]},{"name":"FilledButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledButton\\cfusion.story.luau"]}]},{"name":"FilledIconButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledIconButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledIconButton\\cfusion.story.luau"]}]},{"name":"IconButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\IconButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\IconButton\\cfusion.story.luau"]}]},{"name":"OutlinedButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedButton\\cfusion.story.luau"]}]},{"name":"OutlinedIconButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedIconButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedIconButton\\cfusion.story.luau"]}]},{"name":"Segmented","className":"ModuleScript","filePaths":["src\\Component\\Button\\Segmented\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\Segmented\\cfusion.story.luau"]}]},{"name":"TextButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\TextButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\TextButton\\cfusion.story.luau"]}]}]}]},{"name":"Config","className":"ModuleScript","filePaths":["src\\Config.luau"]},{"name":"Enums","className":"ModuleScript","filePaths":["src\\Enums.luau"]},{"name":"Sounds","className":"ModuleScript","filePaths":["src\\Sounds.luau"]},{"name":"Test","className":"Folder","children":[{"name":"Source.cfusion","className":"ModuleScript","filePaths":["src\\Test\\Source.cfusion.luau"]}]},{"name":"Types","className":"ModuleScript","filePaths":["src\\Types.luau"]},{"name":"Util","className":"ModuleScript","filePaths":["src\\Util.luau"]}]}]}]}]} \ No newline at end of file +{"name":"synthetic-test","className":"DataModel","filePaths":["dev.project.json"],"children":[{"name":"ReplicatedStorage","className":"ReplicatedStorage","children":[{"name":"Packages","className":"Folder","children":[{"name":"ColdFusion","className":"ModuleScript","filePaths":["Packages\\ColdFusion.lua"]},{"name":"CurveUtil","className":"ModuleScript","filePaths":["Packages\\CurveUtil.lua"]},{"name":"Format","className":"ModuleScript","filePaths":["Packages\\Format.lua"]},{"name":"Fusion","className":"ModuleScript","filePaths":["Packages\\Fusion.lua"]},{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\Maid.lua"]},{"name":"MaterialIcons","className":"ModuleScript","filePaths":["Packages\\MaterialIcons.lua"]},{"name":"MeshUtil","className":"ModuleScript","filePaths":["Packages\\MeshUtil.lua"]},{"name":"Roact","className":"ModuleScript","filePaths":["Packages\\Roact.lua"]},{"name":"Signal","className":"ModuleScript","filePaths":["Packages\\Signal.lua"]},{"name":"TableUtil","className":"ModuleScript","filePaths":["Packages\\TableUtil.lua"]},{"name":"_Index","className":"Folder","children":[{"name":"elttob_fusion@0.2.0","className":"Folder","children":[{"name":"fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\init.lua","Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\default.project.json"],"children":[{"name":"Animation","className":"Folder","children":[{"name":"Spring","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\Spring.lua"]},{"name":"SpringScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\SpringScheduler.lua"]},{"name":"Tween","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\Tween.lua"]},{"name":"TweenScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\TweenScheduler.lua"]},{"name":"getTweenRatio","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\getTweenRatio.lua"]},{"name":"lerpType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\lerpType.lua"]},{"name":"packType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\packType.lua"]},{"name":"springCoefficients","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\springCoefficients.lua"]},{"name":"unpackType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\unpackType.lua"]}]},{"name":"Colour","className":"Folder","children":[{"name":"Oklab","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Colour\\Oklab.lua"]}]},{"name":"Dependencies","className":"Folder","children":[{"name":"captureDependencies","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\captureDependencies.lua"]},{"name":"initDependency","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\initDependency.lua"]},{"name":"sharedState","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\sharedState.lua"]},{"name":"updateAll","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\updateAll.lua"]},{"name":"useDependency","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\useDependency.lua"]}]},{"name":"Instances","className":"Folder","children":[{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Children.lua"]},{"name":"Cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Cleanup.lua"]},{"name":"Hydrate","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Hydrate.lua"]},{"name":"New","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\New.lua"]},{"name":"OnChange","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\OnChange.lua"]},{"name":"OnEvent","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\OnEvent.lua"]},{"name":"Out","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Out.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Ref.lua"]},{"name":"applyInstanceProps","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\applyInstanceProps.lua"]},{"name":"defaultProps","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\defaultProps.lua"]}]},{"name":"Logging","className":"Folder","children":[{"name":"logError","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logError.lua"]},{"name":"logErrorNonFatal","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logErrorNonFatal.lua"]},{"name":"logWarn","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logWarn.lua"]},{"name":"messages","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\messages.lua"]},{"name":"parseError","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\parseError.lua"]}]},{"name":"PubTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\PubTypes.lua"]},{"name":"State","className":"Folder","children":[{"name":"Computed","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Computed.lua"]},{"name":"ForKeys","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForKeys.lua"]},{"name":"ForPairs","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForPairs.lua"]},{"name":"ForValues","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForValues.lua"]},{"name":"Observer","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Observer.lua"]},{"name":"Value","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Value.lua"]},{"name":"unwrap","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\unwrap.lua"]}]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Types.lua"]},{"name":"Utility","className":"Folder","children":[{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\None.lua"]},{"name":"cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\cleanup.lua"]},{"name":"doNothing","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\doNothing.lua"]},{"name":"isSimilar","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\isSimilar.lua"]},{"name":"needsDestruction","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\needsDestruction.lua"]},{"name":"restrictRead","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\restrictRead.lua"]},{"name":"xtypeof","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\xtypeof.lua"]}]}]}]},{"name":"nightcycle_cold-fusion@9.0.7","className":"Folder","children":[{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\Maid.lua"]},{"name":"ServiceProxy","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\ServiceProxy.lua"]},{"name":"Signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\Signal.lua"]},{"name":"TableUtil","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\TableUtil.lua"]},{"name":"cold-fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\init.luau","Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\default.project.json"],"children":[{"name":"Fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\init.lua"],"children":[{"name":"Animation","className":"Folder","children":[{"name":"Spring","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\Spring.lua"]},{"name":"SpringScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\SpringScheduler.lua"]},{"name":"Tween","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\Tween.lua"]},{"name":"TweenScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\TweenScheduler.lua"]},{"name":"getTweenRatio","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\getTweenRatio.lua"]},{"name":"lerpType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\lerpType.lua"]},{"name":"packType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\packType.lua"]},{"name":"springCoefficients","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\springCoefficients.lua"]},{"name":"unpackType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\unpackType.lua"]}]},{"name":"Colour","className":"Folder","children":[{"name":"Oklab","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Colour\\Oklab.lua"]}]},{"name":"Instances","className":"Folder","children":[{"name":"Attribute","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Attribute.lua"]},{"name":"AttributeChange","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\AttributeChange.lua"]},{"name":"AttributeOut","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\AttributeOut.lua"]},{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Children.lua"]},{"name":"Cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Cleanup.lua"]},{"name":"Hydrate","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Hydrate.lua"]},{"name":"New","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\New.lua"]},{"name":"OnChange","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\OnChange.lua"]},{"name":"OnEvent","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\OnEvent.lua"]},{"name":"Out","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Out.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Ref.lua"]},{"name":"applyInstanceProps","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\applyInstanceProps.lua"]},{"name":"defaultProps","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\defaultProps.lua"]}]},{"name":"Logging","className":"Folder","children":[{"name":"logError","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logError.lua"]},{"name":"logErrorNonFatal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logErrorNonFatal.lua"]},{"name":"logWarn","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logWarn.lua"]},{"name":"messages","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\messages.lua"]},{"name":"parseError","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\parseError.lua"]}]},{"name":"PubTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\PubTypes.lua"]},{"name":"State","className":"Folder","children":[{"name":"Computed","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Computed.lua"]},{"name":"ForKeys","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForKeys.lua"]},{"name":"ForPairs","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForPairs.lua"]},{"name":"ForValues","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForValues.lua"]},{"name":"Observer","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Observer.lua"]},{"name":"Value","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Value.lua"]},{"name":"isState","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\isState.lua"]},{"name":"makeUseCallback","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\makeUseCallback.lua"]},{"name":"peek","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\peek.lua"]},{"name":"updateAll","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\updateAll.lua"]}]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Types.lua"]},{"name":"Utility","className":"Folder","children":[{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\None.lua"]},{"name":"cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\cleanup.lua"]},{"name":"doNothing","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\doNothing.lua"]},{"name":"isSimilar","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\isSimilar.lua"]},{"name":"needsDestruction","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\needsDestruction.lua"]},{"name":"restrictRead","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\restrictRead.lua"]},{"name":"xtypeof","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\xtypeof.lua"]}]}]},{"name":"InstanceTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\InstanceTypes.luau"]},{"name":"Interface","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Interface.luau"]},{"name":"Test.story","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Test.story.luau"]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Types.luau"]},{"name":"Util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Util.luau"]}]}]},{"name":"nightcycle_curve-util@1.0.0","className":"Folder","children":[{"name":"Vector","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\Vector.lua"]},{"name":"curve-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\init.lua","Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\default.project.json"],"children":[{"name":"Ease","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\Ease.lua"]},{"name":"Lerp","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\Lerp.lua"]}]}]},{"name":"nightcycle_format@0.1.3","className":"Folder","children":[{"name":"format","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\init.lua","Packages\\_Index\\nightcycle_format@0.1.3\\format\\default.project.json"],"children":[{"name":"Emoji","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\Emoji.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\init.spec.lua"]}]},{"name":"maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\maid.lua"]},{"name":"signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\signal.lua"]},{"name":"string","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\string.lua"]}]},{"name":"nightcycle_geometry-util@1.1.1","className":"Folder","children":[{"name":"geometry-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\init.lua","Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\default.project.json"],"children":[{"name":"Earcut","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\Earcut\\init.lua"],"children":[{"name":"ZeroArray","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\Earcut\\ZeroArray.lua"]}]}]}]},{"name":"nightcycle_maid@1.1.4","className":"Folder","children":[{"name":"maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\init.lua","Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\default.project.json"],"children":[{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\Maid.lua"]},{"name":"MaidTaskUtils","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\MaidTaskUtils.lua"]}]}]},{"name":"nightcycle_material-icons@1.0.1","className":"Folder","children":[{"name":"material-icons","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\init.luau","Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\default.project.json"],"children":[{"name":"Default_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_1.luau"]},{"name":"Default_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_2.luau"]},{"name":"Default_18_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_3.luau"]},{"name":"Default_18_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_4.luau"]},{"name":"Default_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_1.luau"]},{"name":"Default_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_2.luau"]},{"name":"Default_24_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_3.luau"]},{"name":"Default_24_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_4.luau"]},{"name":"Default_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_1.luau"]},{"name":"Default_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_2.luau"]},{"name":"Default_36_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_3.luau"]},{"name":"Default_36_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_4.luau"]},{"name":"Default_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_1.luau"]},{"name":"Default_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_2.luau"]},{"name":"Default_48_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_3.luau"]},{"name":"Default_48_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_4.luau"]},{"name":"Outlined_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_18_1.luau"]},{"name":"Outlined_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_18_2.luau"]},{"name":"Outlined_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_24_1.luau"]},{"name":"Outlined_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_24_2.luau"]},{"name":"Outlined_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_36_1.luau"]},{"name":"Outlined_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_36_2.luau"]},{"name":"Outlined_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_48_1.luau"]},{"name":"Outlined_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_48_2.luau"]},{"name":"Round_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_18_1.luau"]},{"name":"Round_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_18_2.luau"]},{"name":"Round_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_24_1.luau"]},{"name":"Round_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_24_2.luau"]},{"name":"Round_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_36_1.luau"]},{"name":"Round_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_36_2.luau"]},{"name":"Round_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_48_1.luau"]},{"name":"Round_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_48_2.luau"]},{"name":"Sharp_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_18_1.luau"]},{"name":"Sharp_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_18_2.luau"]},{"name":"Sharp_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_24_1.luau"]},{"name":"Sharp_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_24_2.luau"]},{"name":"Sharp_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_36_1.luau"]},{"name":"Sharp_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_36_2.luau"]},{"name":"Sharp_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_48_1.luau"]},{"name":"Sharp_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_48_2.luau"]},{"name":"TwoTone_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_18_1.luau"]},{"name":"TwoTone_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_18_2.luau"]},{"name":"TwoTone_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_24_1.luau"]},{"name":"TwoTone_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_24_2.luau"]},{"name":"TwoTone_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_36_1.luau"]},{"name":"TwoTone_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_36_2.luau"]},{"name":"TwoTone_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_48_1.luau"]},{"name":"TwoTone_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_48_2.luau"]}]}]},{"name":"nightcycle_mesh-util@1.0.3","className":"Folder","children":[{"name":"GeometryUtil","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\GeometryUtil.lua"]},{"name":"mesh-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\init.lua","Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\default.project.json"],"children":[{"name":"CornerWedgePart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\CornerWedgePart.lua"]},{"name":"Part","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\Part.lua"]},{"name":"TetraPart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\TetraPart.lua"]},{"name":"WedgePart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\WedgePart.lua"]}]}]},{"name":"nightcycle_service-proxy@1.0.0","className":"Folder","children":[{"name":"service-proxy","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_service-proxy@1.0.0\\service-proxy\\src\\init.lua","Packages\\_Index\\nightcycle_service-proxy@1.0.0\\service-proxy\\default.project.json"]}]},{"name":"nightcycle_signal@1.0.2","className":"Folder","children":[{"name":"signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_signal@1.0.2\\signal\\src\\init.lua","Packages\\_Index\\nightcycle_signal@1.0.2\\signal\\default.project.json"]}]},{"name":"nightcycle_string@0.1.0","className":"Folder","children":[{"name":"string","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_string@0.1.0\\string\\src\\init.lua","Packages\\_Index\\nightcycle_string@0.1.0\\string\\default.project.json"],"children":[{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_string@0.1.0\\string\\src\\init.spec.lua"]}]}]},{"name":"nightcycle_table-util@1.1.0","className":"Folder","children":[{"name":"table-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_table-util@1.1.0\\table-util\\src\\init.lua","Packages\\_Index\\nightcycle_table-util@1.1.0\\table-util\\default.project.json"]}]},{"name":"nightcycle_vector@1.0.2","className":"Folder","children":[{"name":"vector","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_vector@1.0.2\\vector\\src\\init.lua","Packages\\_Index\\nightcycle_vector@1.0.2\\vector\\default.project.json"]}]},{"name":"roblox_roact@1.4.4","className":"Folder","children":[{"name":"roact","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\init.lua","Packages\\_Index\\roblox_roact@1.4.4\\roact\\default.project.json"],"children":[{"name":"Binding","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Binding.lua"]},{"name":"Binding.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Binding.spec.lua"]},{"name":"Component","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.lua"]},{"name":"Component.spec","className":"Folder","children":[{"name":"context.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\context.spec.lua"]},{"name":"defaultProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\defaultProps.spec.lua"]},{"name":"didMount.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\didMount.spec.lua"]},{"name":"didUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\didUpdate.spec.lua"]},{"name":"extend.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\extend.spec.lua"]},{"name":"getDerivedStateFromProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\getDerivedStateFromProps.spec.lua"]},{"name":"getElementTraceback.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\getElementTraceback.spec.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\init.spec.lua"]},{"name":"legacyContext.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\legacyContext.spec.lua"]},{"name":"render.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\render.spec.lua"]},{"name":"setState.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\setState.spec.lua"]},{"name":"shouldUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\shouldUpdate.spec.lua"]},{"name":"validateProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\validateProps.spec.lua"]},{"name":"willUnmount.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\willUnmount.spec.lua"]},{"name":"willUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\willUpdate.spec.lua"]}]},{"name":"ComponentLifecyclePhase","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ComponentLifecyclePhase.lua"]},{"name":"Config","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Config.lua"]},{"name":"Config.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Config.spec.lua"]},{"name":"ElementKind","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementKind.lua"]},{"name":"ElementKind.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementKind.spec.lua"]},{"name":"ElementUtils","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementUtils.lua"]},{"name":"ElementUtils.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementUtils.spec.lua"]},{"name":"GlobalConfig","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\GlobalConfig.lua"]},{"name":"GlobalConfig.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\GlobalConfig.spec.lua"]},{"name":"Logging","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Logging.lua"]},{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\None.lua"]},{"name":"NoopRenderer","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\NoopRenderer.lua"]},{"name":"Portal","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Portal.lua"]},{"name":"PropMarkers","className":"Folder","children":[{"name":"Change","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Change.lua"]},{"name":"Change.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Change.spec.lua"]},{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Children.lua"]},{"name":"Event","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Event.lua"]},{"name":"Event.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Event.spec.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Ref.lua"]}]},{"name":"PureComponent","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PureComponent.lua"]},{"name":"PureComponent.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PureComponent.spec.lua"]},{"name":"RobloxRenderer","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\RobloxRenderer.lua"]},{"name":"RobloxRenderer.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\RobloxRenderer.spec.lua"]},{"name":"SingleEventManager","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\SingleEventManager.lua"]},{"name":"SingleEventManager.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\SingleEventManager.spec.lua"]},{"name":"Symbol","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Symbol.lua"]},{"name":"Symbol.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Symbol.spec.lua"]},{"name":"Type","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Type.lua"]},{"name":"Type.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Type.spec.lua"]},{"name":"assertDeepEqual","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assertDeepEqual.lua"]},{"name":"assertDeepEqual.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assertDeepEqual.spec.lua"]},{"name":"assign","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assign.lua"]},{"name":"assign.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assign.spec.lua"]},{"name":"createContext","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createContext.lua"]},{"name":"createContext.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createContext.spec.lua"]},{"name":"createElement","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createElement.lua"]},{"name":"createElement.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createElement.spec.lua"]},{"name":"createFragment","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createFragment.lua"]},{"name":"createFragment.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createFragment.spec.lua"]},{"name":"createReconciler","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconciler.lua"]},{"name":"createReconciler.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconciler.spec.lua"]},{"name":"createReconcilerCompat","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconcilerCompat.lua"]},{"name":"createReconcilerCompat.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconcilerCompat.spec.lua"]},{"name":"createRef","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createRef.lua"]},{"name":"createRef.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createRef.spec.lua"]},{"name":"createSignal","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSignal.lua"]},{"name":"createSignal.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSignal.spec.lua"]},{"name":"createSpy","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSpy.lua"]},{"name":"createSpy.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSpy.spec.lua"]},{"name":"forwardRef","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\forwardRef.lua"]},{"name":"forwardRef.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\forwardRef.spec.lua"]},{"name":"getDefaultInstanceProperty","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\getDefaultInstanceProperty.lua"]},{"name":"getDefaultInstanceProperty.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\getDefaultInstanceProperty.spec.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\init.spec.lua"]},{"name":"internalAssert","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\internalAssert.lua"]},{"name":"invalidSetStateMessages","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\invalidSetStateMessages.lua"]},{"name":"oneChild","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\oneChild.lua"]},{"name":"oneChild.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\oneChild.spec.lua"]},{"name":"strict","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\strict.lua"]},{"name":"strict.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\strict.spec.lua"]}]}]}]},{"name":"synthetic","className":"ModuleScript","filePaths":["src\\init.luau"],"children":[{"name":"Component","className":"Folder","children":[{"name":"Bar","className":"Folder","children":[{"name":"Bottom","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Bottom\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Bottom\\cfusion.story.luau"]}]},{"name":"Top","className":"Folder","children":[{"name":"Base","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Base.luau"]},{"name":"Center","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Center\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Center\\cfusion.story.luau"]}]},{"name":"Large","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Large\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Large\\cfusion.story.luau"]}]},{"name":"Medium","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Medium\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Medium\\cfusion.story.luau"]}]},{"name":"Small","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Small\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Small\\cfusion.story.luau"]}]}]}]},{"name":"Button","className":"Folder","children":[{"name":"Badge","className":"ModuleScript","filePaths":["src\\Component\\Button\\Badge\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\Badge\\cfusion.story.luau"]}]},{"name":"Base","className":"ModuleScript","filePaths":["src\\Component\\Button\\Base.luau"]},{"name":"ElevatedButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\ElevatedButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\ElevatedButton\\cfusion.story.luau"]}]},{"name":"ExtendedFAB","className":"ModuleScript","filePaths":["src\\Component\\Button\\ExtendedFAB\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\ExtendedFAB\\cfusion.story.luau"]}]},{"name":"FAB","className":"ModuleScript","filePaths":["src\\Component\\Button\\FAB\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\FAB\\cfusion.story.luau"]}]},{"name":"FilledButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledButton\\cfusion.story.luau"]}]},{"name":"FilledIconButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledIconButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledIconButton\\cfusion.story.luau"]}]},{"name":"IconButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\IconButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\IconButton\\cfusion.story.luau"]}]},{"name":"OutlinedButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedButton\\cfusion.story.luau"]}]},{"name":"OutlinedIconButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedIconButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedIconButton\\cfusion.story.luau"]}]},{"name":"Segmented","className":"ModuleScript","filePaths":["src\\Component\\Button\\Segmented\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\Segmented\\cfusion.story.luau"]}]},{"name":"TextButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\TextButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\TextButton\\cfusion.story.luau"]}]}]}]},{"name":"Config","className":"ModuleScript","filePaths":["src\\Config.luau"]},{"name":"Enums","className":"ModuleScript","filePaths":["src\\Enums.luau"]},{"name":"Sounds","className":"ModuleScript","filePaths":["src\\Sounds.luau"]},{"name":"Test","className":"Folder","children":[{"name":"Source.cfusion","className":"ModuleScript","filePaths":["src\\Test\\Source.cfusion.luau"]}]},{"name":"Theme","className":"ModuleScript","filePaths":["src\\Theme\\init.luau"],"children":[{"name":"Blend","className":"ModuleScript","filePaths":["src\\Theme\\Blend.luau"]},{"name":"ColorUtil","className":"ModuleScript","filePaths":["src\\Theme\\ColorUtil.luau"]},{"name":"HCT","className":"ModuleScript","filePaths":["src\\Theme\\HCT\\init.luau"],"children":[{"name":"Cam16","className":"ModuleScript","filePaths":["src\\Theme\\HCT\\Cam16.luau"]},{"name":"Solver","className":"ModuleScript","filePaths":["src\\Theme\\HCT\\Solver.luau"]}]},{"name":"MathUtil","className":"ModuleScript","filePaths":["src\\Theme\\MathUtil.luau"]},{"name":"Palettes","className":"Folder","children":[{"name":"Core","className":"ModuleScript","filePaths":["src\\Theme\\Palettes\\Core.luau"]},{"name":"Tonal","className":"ModuleScript","filePaths":["src\\Theme\\Palettes\\Tonal.luau"]}]},{"name":"Scheme","className":"ModuleScript","filePaths":["src\\Theme\\Scheme\\init.luau"]},{"name":"Test.story","className":"ModuleScript","filePaths":["src\\Theme\\Test.story.luau"]},{"name":"ThemeUtil","className":"ModuleScript","filePaths":["src\\Theme\\ThemeUtil.luau"]},{"name":"ViewingConditions","className":"ModuleScript","filePaths":["src\\Theme\\ViewingConditions.luau"]}]},{"name":"Types","className":"ModuleScript","filePaths":["src\\Types.luau"]},{"name":"Util","className":"ModuleScript","filePaths":["src\\Util.luau"]}]}]}]}]} \ No newline at end of file diff --git a/src/Color/Blend.luau b/src/Color/Blend.luau deleted file mode 100644 index 0e0c7bdc..00000000 --- a/src/Color/Blend.luau +++ /dev/null @@ -1,48 +0,0 @@ ---!strict --- https://github.com/material-foundation/material-color-utilities/blob/f5d03da60c268b43928f3a24d6bf499e2564d39a/typescript/blend/blend.ts -local Cam16 = require(script.Parent:WaitForChild("HCT"):WaitForChild("Cam16")) -local HCT = require(script.Parent:WaitForChild("HCT")) -local ColorUtils = require(script.Parent:WaitForChild("ColorUtils")) - -local Blend = {} - -function Blend.harmonize(designColor: number, sourceColor: number): number - local fromHct = HCT.fromInt(designColor); - local toHct = HCT.fromInt(sourceColor); - local differenceDegrees = MathUtils.differenceDegrees(fromHct.hue, toHct.hue); - local rotationDegrees = math.min(differenceDegrees * 0.5, 15.0); - local outputHue = MathUtils.sanitizeDegreesDouble( - fromHct.hue + - rotationDegrees * MathUtils.rotationDirection(fromHct.hue, toHct.hue)); - return HCT.from(outputHue, fromHct.chroma, fromHct.tone):toInt(); -end - -function Blend.hctHue(from: number, to: number, amount: number): number - local ucs = Blend.cam16Ucs(from, to, amount); - local ucsCam = Cam16.fromInt(ucs); - local fromCam = Cam16.fromInt(from); - local blended = HCT.from( - ucsCam.hue, - fromCam.chroma, - ColorUtils.lstarFromArgb(from), - ); - return blended:toInt(); -end - -function Blend.cam16Ucs(from: number, to: number, amount: number): number - local fromCam = Cam16.fromInt(from); - local toCam = Cam16.fromInt(to); - local fromJ = fromCam.jstar; - local fromA = fromCam.astar; - local fromB = fromCam.bstar; - local toJ = toCam.jstar; - local toA = toCam.astar; - local toB = toCam.bstar; - local jstar = fromJ + (toJ - fromJ) * amount; - local astar = fromA + (toA - fromA) * amount; - local bstar = fromB + (toB - fromB) * amount; - return Cam16.fromUcs(jstar, astar, bstar).toInt(); -end - - -return Blend \ No newline at end of file diff --git a/src/Color/ColorUtils.luau b/src/Color/ColorUtils.luau deleted file mode 100644 index 3941af59..00000000 --- a/src/Color/ColorUtils.luau +++ /dev/null @@ -1 +0,0 @@ -return {} \ No newline at end of file diff --git a/src/Color/MathUtils.luau b/src/Color/MathUtils.luau deleted file mode 100644 index 3941af59..00000000 --- a/src/Color/MathUtils.luau +++ /dev/null @@ -1 +0,0 @@ -return {} \ No newline at end of file diff --git a/src/Color/Palettes/Core.luau b/src/Color/Palettes/Core.luau deleted file mode 100644 index 3941af59..00000000 --- a/src/Color/Palettes/Core.luau +++ /dev/null @@ -1 +0,0 @@ -return {} \ No newline at end of file diff --git a/src/Color/Palettes/Tonal.luau b/src/Color/Palettes/Tonal.luau deleted file mode 100644 index 3941af59..00000000 --- a/src/Color/Palettes/Tonal.luau +++ /dev/null @@ -1 +0,0 @@ -return {} \ No newline at end of file diff --git a/src/Color/Scheme/init.luau b/src/Color/Scheme/init.luau deleted file mode 100644 index 3941af59..00000000 --- a/src/Color/Scheme/init.luau +++ /dev/null @@ -1 +0,0 @@ -return {} \ No newline at end of file diff --git a/src/Color/ViewingConditions.luau b/src/Color/ViewingConditions.luau deleted file mode 100644 index 3941af59..00000000 --- a/src/Color/ViewingConditions.luau +++ /dev/null @@ -1 +0,0 @@ -return {} \ No newline at end of file diff --git a/src/Theme/Blend.luau b/src/Theme/Blend.luau new file mode 100644 index 00000000..17f59258 --- /dev/null +++ b/src/Theme/Blend.luau @@ -0,0 +1,45 @@ +--!strict +-- https://github.com/material-foundation/material-color-utilities/blob/f5d03da60c268b43928f3a24d6bf499e2564d39a/typescript/blend/blend.ts +local Cam16 = require(script.Parent:WaitForChild("HCT"):WaitForChild("Cam16")) +local HCT = require(script.Parent:WaitForChild("HCT")) +local ColorUtil = require(script.Parent:WaitForChild("ColorUtil")) +local MathUtil = require(script.Parent:WaitForChild("MathUtil")) + +type HCT = HCT.HCT + +local Blend = {} + +function Blend.harmonize(designColor: number, sourceColor: number): number + local fromHct: HCT = HCT.fromInt(designColor) + local toHct: HCT = HCT.fromInt(sourceColor) + local differenceDegrees = MathUtil.differenceDegrees(fromHct:getHue(), toHct:getHue()) + local rotationDegrees = math.min(differenceDegrees * 0.5, 15.0) + local outputHue = + MathUtil.sanitizeDegreesDouble(fromHct:getHue() + rotationDegrees * MathUtil.rotationDirection(fromHct:getHue(), toHct:getHue())) + return HCT.from(outputHue, fromHct:getChroma(), fromHct:getTone()):toInt() +end + +function Blend.hctHue(from: number, to: number, amount: number): number + local ucs = Blend.cam16Ucs(from, to, amount) + local ucsCam = Cam16.fromInt(ucs) + local fromCam = Cam16.fromInt(from) + local blended = HCT.from(ucsCam.hue, fromCam.chroma, ColorUtil.lstarFromArgb(from)) + return blended:toInt() +end + +function Blend.cam16Ucs(from: number, to: number, amount: number): number + local fromCam = Cam16.fromInt(from) + local toCam = Cam16.fromInt(to) + local fromJ = fromCam.jstar + local fromA = fromCam.astar + local fromB = fromCam.bstar + local toJ = toCam.jstar + local toA = toCam.astar + local toB = toCam.bstar + local jstar = fromJ + (toJ - fromJ) * amount + local astar = fromA + (toA - fromA) * amount + local bstar = fromB + (toB - fromB) * amount + return Cam16.fromUcs(jstar, astar, bstar):toInt() +end + +return Blend diff --git a/src/Theme/ColorUtil.luau b/src/Theme/ColorUtil.luau new file mode 100644 index 00000000..ac4d8613 --- /dev/null +++ b/src/Theme/ColorUtil.luau @@ -0,0 +1,242 @@ +--!strict +-- https://github.com/material-foundation/material-color-utilities/blob/f5d03da60c268b43928f3a24d6bf499e2564d39a/typescript/utils/color_utils.ts +local MathUtil = require(script.Parent:WaitForChild("MathUtil")) + +export type Rgba = { + r: number, + g: number, + b: number, + a: number, +} + +local SRGB_TO_XYZ = { + [0] = { + [0] = 0.41233895, + [1] = 0.35762064, + [2] = 0.18051042 + }, + [1] = { + [0] = 0.2126, + [1] = 0.7152, + [2] = 0.0722 + }, + [2] = { + [0] = 0.01932141, + [1] = 0.11916382, + [2] = 0.95034478 + }, +} + +local XYZ_TO_SRGB = { + [0] = { + [0] = 3.2413774792388685, + [1] = -1.5376652402851851, + [2] = -0.49885366846268053, + }, + [1] = { + -0.9691452513005321, + [1] = 1.8758853451067872, + [2] = 0.04156585616912061, + }, + [2] = { + [0] = 0.05562093689691305, + [1] = -0.20395524564742123, + [2] = 1.0571799111220335, + }, +} + +local WHITE_POINT_D65 = { + [0] = 95.047, + [1] = 100.0, + [2] = 108.883 +} + +function clampComponent(value: number) + if value < 0 then + return 0 + end + if value > 255 then + return 255 + end + return value +end + +function labF(t: number): number + local e = 216.0 / 24389.0 + local kappa = 24389.0 / 27.0 + if t > e then + return math.pow(t, 1.0 / 3.0) + else + return (kappa * t + 16) / 116 + end +end + +function labInvf(ft: number): number + local e = 216.0 / 24389.0 + local kappa = 24389.0 / 27.0 + local ft3 = ft * ft * ft + if ft3 > e then + return ft3 + else + return (116 * ft - 16) / kappa + end +end + +local Util = {} + +function Util.argbFromLinrgb(linrgb: { number }): number + local r = Util.delinearized(linrgb[0]) + local g = Util.delinearized(linrgb[1]) + local b = Util.delinearized(linrgb[2]) + return Util.argbFromRgb(r, g, b) +end + +function Util.argbFromRgb(red: number, green: number, blue: number): number + return bit32.lshift(255, 24) + bit32.lshift(bit32.band(red, 255), 16) + bit32.lshift(bit32.band(green, 255), 8) + bit32.band(blue, 255) +end + +function Util.alphaFromArgb(argb: number): number + return bit32.band(bit32.rshift(argb, 24), 255) +end + +function Util.redFromArgb(argb: number): number + return bit32.band(bit32.rshift(argb, 16), 255) +end +function Util.greenFromArgb(argb: number): number + return bit32.band(bit32.rshift(argb, 8), 255) +end + +function Util.blueFromArgb(argb: number): number + return bit32.band(argb, 255) +end + +function Util.isOpaque(argb: number): boolean + return Util.alphaFromArgb(argb) >= 255 +end + +function Util.argbFromXyz(x: number, y: number, z: number): number + local matrix = XYZ_TO_SRGB + local linearR = matrix[0][0] * x + matrix[0][1] * y + matrix[0][2] * z + local linearG = matrix[1][0] * x + matrix[1][1] * y + matrix[1][2] * z + local linearB = matrix[2][0] * x + matrix[2][1] * y + matrix[2][2] * z + local r = Util.delinearized(linearR) + local g = Util.delinearized(linearG) + local b = Util.delinearized(linearB) + return Util.argbFromRgb(r, g, b) +end + +function Util.xyzFromArgb(argb: number): { number } + local r = Util.linearized(Util.redFromArgb(argb)) + local g = Util.linearized(Util.greenFromArgb(argb)) + local b = Util.linearized(Util.blueFromArgb(argb)) + return MathUtil.matrixMultiply({ + [0]=r, + [1]=g, + [2]=b + }, SRGB_TO_XYZ) +end + +function Util.argbFromLab(l: number, a: number, b: number): number + local whitePoint = WHITE_POINT_D65 + local fy = (l + 16.0) / 116.0 + local fx = a / 500.0 + fy + local fz = fy - b / 200.0 + local xNormalized = labInvf(fx) + local yNormalized = labInvf(fy) + local zNormalized = labInvf(fz) + local x = xNormalized * whitePoint[0] + local y = yNormalized * whitePoint[1] + local z = zNormalized * whitePoint[2] + return Util.argbFromXyz(x, y, z) +end + +function Util.labFromArgb(argb: number): { number } + local linearR = Util.linearized(Util.redFromArgb(argb)) + local linearG = Util.linearized(Util.greenFromArgb(argb)) + local linearB = Util.linearized(Util.blueFromArgb(argb)) + local matrix = SRGB_TO_XYZ + local x = matrix[0][0] * linearR + matrix[0][1] * linearG + matrix[0][2] * linearB + local y = matrix[1][0] * linearR + matrix[1][1] * linearG + matrix[1][2] * linearB + local z = matrix[2][0] * linearR + matrix[2][1] * linearG + matrix[2][2] * linearB + local whitePoint = WHITE_POINT_D65 + local xNormalized = x / whitePoint[0] + local yNormalized = y / whitePoint[1] + local zNormalized = z / whitePoint[2] + local fx = labF(xNormalized) + local fy = labF(yNormalized) + local fz = labF(zNormalized) + local l = 116.0 * fy - 16 + local a = 500.0 * (fx - fy) + local b = 200.0 * (fy - fz) + return { + [0]=l, + [1]=a, + [2]=b + } +end + +function Util.argbFromLstar(lstar: number): number + local y = Util.yFromLstar(lstar) + local component = Util.delinearized(y) + return Util.argbFromRgb(component, component, component) +end + +function Util.lstarFromArgb(argb: number): number + local y = Util.xyzFromArgb(argb)[1] + return 116.0 * labF(y / 100.0) - 16.0 +end + +function Util.yFromLstar(lstar: number): number + return 100.0 * labInvf((lstar + 16.0) / 116.0) +end + +function Util.lstarFromY(y: number): number + return labF(y / 100.0) * 116.0 - 16.0 +end + +function Util.linearized(rgbComponent: number): number + local normalized = rgbComponent / 255.0 + if normalized <= 0.040449936 then + return normalized / 12.92 * 100.0 + else + return math.pow((normalized + 0.055) / 1.055, 2.4) * 100.0 + end +end + +function Util.delinearized(rgbComponent: number): number + local normalized = rgbComponent / 100.0 + local delinearized = 0.0 + if normalized <= 0.0031308 then + delinearized = normalized * 12.92 + else + delinearized = 1.055 * math.pow(normalized, 1.0 / 2.4) - 0.055 + end + return MathUtil.clampInt(0, 255, math.round(delinearized * 255.0)) +end + +function Util.whitePointD65(): { number } + return WHITE_POINT_D65 +end + +function Util.rgbaFromArgb(argb: number): Rgba + local r = Util.redFromArgb(argb) + local g = Util.greenFromArgb(argb) + local b = Util.blueFromArgb(argb) + local a = Util.alphaFromArgb(argb) + return { + r = r, + g = g, + b = b, + a = a, + } +end + +function Util.argbFromRgba(rgba) + local rValue = clampComponent(rgba.r) + local gValue = clampComponent(rgba.g) + local bValue = clampComponent(rgba.b) + local aValue = clampComponent(rgba.a) + return bit32.lshift(aValue, 24) + bit32.lshift(rValue, 16) + bit32.lshift(gValue, 8) + bValue +end + +return Util diff --git a/src/Color/HCT/Cam16.luau b/src/Theme/HCT/Cam16.luau similarity index 96% rename from src/Color/HCT/Cam16.luau rename to src/Theme/HCT/Cam16.luau index 1463b288..1db80fc3 100644 --- a/src/Color/HCT/Cam16.luau +++ b/src/Theme/HCT/Cam16.luau @@ -1,6 +1,6 @@ --!strict -- https://github.com/material-foundation/material-color-utilities/blob/f5d03da60c268b43928f3a24d6bf499e2564d39a/typescript/hct/cam16.ts -local ColorUtils = require(script.Parent.Parent:WaitForChild("ColorUtils")) +local ColorUtil = require(script.Parent.Parent:WaitForChild("ColorUtil")) local ViewingConditions = require(script.Parent.Parent:WaitForChild("ViewingConditions")) -- Types @@ -67,9 +67,9 @@ function Cam16.fromIntInViewingConditions(argb: number, viewingConditions: Viewi local green = bit32.rshift(bit32.band(argb, 0x0000ff00), 8) local blue = bit32.band(argb, 0x000000ff) - local redL = ColorUtils.linearized(red) - local greenL = ColorUtils.linearized(green) - local blueL = ColorUtils.linearized(blue) + local redL = ColorUtil.linearized(red) + local greenL = ColorUtil.linearized(green) + local blueL = ColorUtil.linearized(blue) local x = 0.41233895 * redL + 0.35762064 * greenL + 0.18051042 * blueL local y = 0.2126 * redL + 0.7152 * greenL + 0.0722 * blueL @@ -168,7 +168,7 @@ function Cam16.fromUcsInViewingConditions(jstar: number, astar: number, bstar: n end function Cam16:toInt(): number - return self.viewed(ViewingConditions.DEFAULT) + return self:viewed(ViewingConditions.DEFAULT) end function Cam16:viewed(viewingConditions: ViewingConditions): number @@ -212,8 +212,8 @@ function Cam16:viewed(viewingConditions: ViewingConditions): number local y = 0.38752654 * rF + 0.62144744 * gF - 0.00897398 * bF local z = -0.01584150 * rF - 0.03412294 * gF + 1.04996444 * bF - -- Assuming ColorUtils.argbFromXyz is a function that converts XYZ to ARGB. - local argb = ColorUtils.argbFromXyz(x, y, z) + -- Assuming ColorUtil.argbFromXyz is a function that converts XYZ to ARGB. + local argb = ColorUtil.argbFromXyz(x, y, z) return argb end @@ -327,7 +327,11 @@ function Cam16:xyzInViewingConditions(viewingConditions: ViewingConditions): { n local y = 0.38752654 * rF + 0.62144744 * gF - 0.00897398 * bF local z = -0.01584150 * rF - 0.03412294 * gF + 1.04996444 * bF - return { x, y, z } + return { + [0]=x, + [1]=y, + [2]=z + } end return Cam16 diff --git a/src/Color/HCT/Solver.luau b/src/Theme/HCT/Solver.luau similarity index 86% rename from src/Color/HCT/Solver.luau rename to src/Theme/HCT/Solver.luau index 7be17770..200f8d74 100644 --- a/src/Color/HCT/Solver.luau +++ b/src/Theme/HCT/Solver.luau @@ -1,7 +1,8 @@ +--!strict -- https://github.com/material-foundation/material-color-utilities/blob/f5d03da60c268b43928f3a24d6bf499e2564d39a/typescript/hct/hct_solver.ts -- This file is automatically generated. Do not modify it. -local ColorUtils = require(script.Parent.Parent:WaitForChild("ColorUtils")) -local MathUtils = require(script.Parent.Parent:WaitForChild("MathUtils")) +local ColorUtil = require(script.Parent.Parent:WaitForChild("ColorUtil")) +local MathUtil = require(script.Parent.Parent:WaitForChild("MathUtil")) local Cam16 = require(script.Parent:WaitForChild("Cam16")) local ViewingConditions = require(script.Parent.Parent:WaitForChild("ViewingConditions")) @@ -10,47 +11,54 @@ local ViewingConditions = require(script.Parent.Parent:WaitForChild("ViewingCond -- class as a namespace facilitates this. -- -- tslint:disable:class-as-namespace + +type Cam16 = Cam16.Cam16 + local Solver = {} Solver.SCALED_DISCOUNT_FROM_LINRGB = { - { - 0.001200833568784504, - 0.002389694492170889, - 0.0002795742885861124, + [0] = { + [0] = 0.001200833568784504, + [1] = 0.002389694492170889, + [2] = 0.0002795742885861124, }, - { - 0.0005891086651375999, - 0.0029785502573438758, - 0.0003270666104008398, + [1] = { + [0] = 0.0005891086651375999, + [1] = 0.0029785502573438758, + [2] = 0.0003270666104008398, }, - { - 0.00010146692491640572, - 0.0005364214359186694, - 0.0032979401770712076, + [2] = { + [0] = 0.00010146692491640572, + [1] = 0.0005364214359186694, + [2] = 0.0032979401770712076, }, } Solver.LINRGB_FROM_SCALED_DISCOUNT = { - { - 1373.2198709594231, - -1100.4251190754821, - -7.278681089101213, + [0] = { + [0] = 1373.2198709594231, + [1] = -1100.4251190754821, + [2] = -7.278681089101213, }, - { - -271.815969077903, - 559.6580465940733, - -32.46047482791194, + [1] = { + [0] = -271.815969077903, + [1] = 559.6580465940733, + [2] = -32.46047482791194, }, - { - 1.9622899599665666, - -57.173814538844006, - 308.7233197812385, + [2] = { + [0] = 1.9622899599665666, + [1] = -57.173814538844006, + [2] = 308.7233197812385, }, } -Solver.Y_FROM_LINRGB = { 0.2126, 0.7152, 0.0722 } +Solver.Y_FROM_LINRGB = { + [0] = 0.2126, + [1] = 0.7152, + [2] = 0.0722 +} -Solver.CRITICAL_PLANES = { +local CRITICAL_PLANES_OFFSET = { 0.015176349177441876, 0.045529047532325624, 0.07588174588720938, @@ -307,6 +315,10 @@ Solver.CRITICAL_PLANES = { 98.6670533535366, 99.55452497210776, } +Solver.CRITICAL_PLANES = {} :: {[number]: number} +for i, v in ipairs(CRITICAL_PLANES_OFFSET) do + Solver.CRITICAL_PLANES[i-1] = v +end function Solver._sanitizeRadians(angle: number): number return (angle + math.pi * 8) % (math.pi * 2) @@ -329,7 +341,7 @@ function Solver._chromaticAdaptation(component: number): number end function Solver._hueOf(linrgb: { number }): number - local scaledDiscount = MathUtils.matrixMultiply(linrgb, Solver.SCALED_DISCOUNT_FROM_LINRGB) + local scaledDiscount = MathUtil.matrixMultiply(linrgb, Solver.SCALED_DISCOUNT_FROM_LINRGB) local rA = Solver._chromaticAdaptation(scaledDiscount[0]) local gA = Solver._chromaticAdaptation(scaledDiscount[1]) local bA = Solver._chromaticAdaptation(scaledDiscount[2]) @@ -352,14 +364,14 @@ end function Solver._lerpPoint(source: { number }, t: number, target: { number }): { number } return { - source[0] + (target[0] - source[0]) * t, - source[1] + (target[1] - source[1]) * t, - source[2] + (target[2] - source[2]) * t, + [0]=source[0] + (target[0] - source[0]) * t, + [1]=source[1] + (target[1] - source[1]) * t, + [2]=source[2] + (target[2] - source[2]) * t, } end function Solver._setCoordinate(source: { number }, coordinate: number, target: { number }, axis: number): { number } - local t = Solver.intercept(source[axis], coordinate, target[axis]) + local t = Solver._intercept(source[axis], coordinate, target[axis]) return Solver._lerpPoint(source, t, target) end @@ -378,33 +390,61 @@ function Solver._nthVertex(y: number, n: number): { number } local b = coordB local r = (y - g * kG - b * kB) / kR if Solver._isBounded(r) then - return { r, g, b } + return { + [0]=r, + [1]=g, + [2]=b + } else - return { -1.0, -1.0, -1.0 } + return { + [0]=-1.0, + [1]=-1.0, + [2]=-1.0 + } end elseif n < 8 then local b = coordA local r = coordB local g = (y - r * kR - b * kB) / kG if Solver._isBounded(g) then - return { r, g, b } + return { + [0]=r, + [1]=g, + [2]=b + } else - return { -1.0, -1.0, -1.0 } + return { + [0]=-1.0, + [1]=-1.0, + [2]=-1.0 + } end else local r = coordA local g = coordB local b = (y - r * kR - g * kG) / kB if Solver._isBounded(b) then - return { r, g, b } + return { + [0]=r, + [1]=g, + [2]=b + } else - return { -1.0, -1.0, -1.0 } + return { + [0]=-1.0, + [1]=-1.0, + [2]=-1.0 + } end end end function Solver._bisectToSegment(y: number, targetHue: number): { { number } } - local left = { -1.0, -1.0, -1.0 } + local left = { + [0]=-1.0, + [1]=-1.0, + [2]=-1.0 + } local right = left local leftHue = 0.0 local rightHue = 0.0 @@ -435,14 +475,17 @@ function Solver._bisectToSegment(y: number, targetHue: number): { { number } } end end end - return { left, right } + return { + [0]=left, + [1]=right + } end function Solver._midpoint(a: { number }, b: { number }): { number } return { - (a[0] + b[0]) / 2, - (a[1] + b[1]) / 2, - (a[2] + b[2]) / 2, + [0]=(a[0] + b[0]) / 2, + [1]=(a[1] + b[1]) / 2, + [2]=(a[2] + b[2]) / 2, } end @@ -535,7 +578,11 @@ function Solver._findResultByJ(hueRadians: number, chroma: number, y: number): n local gCScaled = Solver._inverseChromaticAdaptation(gA) local bCScaled = Solver._inverseChromaticAdaptation(bA) - local linrgb = MathUtils.matrixMultiply({ rCScaled, gCScaled, bCScaled }, Solver.LINRGB_FROM_SCALED_DISCOUNT) + local linrgb = MathUtil.matrixMultiply({ + [0]=rCScaled, + [1]=gCScaled, + [2]=bCScaled + }, Solver.LINRGB_FROM_SCALED_DISCOUNT) -- ======================================== -- Operations inlined from Cam16 to avoid repeated calculation -- ======================================== @@ -553,7 +600,7 @@ function Solver._findResultByJ(hueRadians: number, chroma: number, y: number): n if linrgb[0] > 100.01 or linrgb[1] > 100.01 or linrgb[2] > 100.01 then return 0 end - return ColorUtils.argbFromLinrgb(linrgb) + return ColorUtil.argbFromLinrgb(linrgb) end j = j - (fnj - y) * j / (2 * fnj) end @@ -562,19 +609,21 @@ end function Solver.solveToInt(hueDegrees: number, chroma: number, lstar: number): number if chroma < 0.0001 or lstar < 0.0001 or lstar > 99.9999 then - return ColorUtils.argbFromLstar(lstar) + return ColorUtil.argbFromLstar(lstar) end - hueDegrees = MathUtils.sanitizeDegreesDouble(hueDegrees) + hueDegrees = MathUtil.sanitizeDegreesDouble(hueDegrees) local hueRadians = hueDegrees / 180 * math.pi - local y = ColorUtils.yFromLstar(lstar) + local y = ColorUtil.yFromLstar(lstar) local exactAnswer = Solver._findResultByJ(hueRadians, chroma, y) if exactAnswer ~= 0 then return exactAnswer end local linrgb = Solver._bisectToLimit(y, hueRadians) - return ColorUtils.argbFromLinrgb(linrgb) + return ColorUtil.argbFromLinrgb(linrgb) end function Solver.solveToCam(hueDegrees: number, chroma: number, lstar: number): Cam16 return Cam16.fromInt(Solver.solveToInt(hueDegrees, chroma, lstar)) end + +return Solver \ No newline at end of file diff --git a/src/Color/HCT/init.luau b/src/Theme/HCT/init.luau similarity index 54% rename from src/Color/HCT/init.luau rename to src/Theme/HCT/init.luau index 23984059..b7275a3d 100644 --- a/src/Color/HCT/init.luau +++ b/src/Theme/HCT/init.luau @@ -2,7 +2,7 @@ -- https://github.com/material-foundation/material-color-utilities/blob/f5d03da60c268b43928f3a24d6bf499e2564d39a/typescript/hct/hct.ts local Solver = require(script:WaitForChild("Solver")) local Cam16 = require(script:WaitForChild("Cam16")) -local ColorUtils = require(script.Parent:WaitForChild("ColorUtils")) +local ColorUtil = require(script.Parent:WaitForChild("ColorUtil")) local ViewingConditions = require(script.Parent:WaitForChild("ViewingConditions")) type ViewingConditions = ViewingConditions.ViewingConditions @@ -10,9 +10,9 @@ type ViewingConditions = ViewingConditions.ViewingConditions export type HCT = { __index: HCT, argb: number, - _internalHue: number; - _internalChroma: number; - _internalTone: number; + _internalHue: number, + _internalChroma: number, + _internalTone: number, from: (hue: number, chroma: number, tone: number) -> HCT, fromInt: (argb: number) -> HCT, new: (argb: number) -> HCT, @@ -31,92 +31,65 @@ local HCT = {} :: HCT HCT.__index = HCT function HCT:toInt(): number - return self.argb; + return self.argb end function HCT:getHue(): number - return self.internalHue; + return self._internalHue end function HCT:setHue(newHue: number): () - self:_setInternalState( - Solver.solveToInt( - newHue, - self._internalChroma, - self._internalTone - ) - ) + self:_setInternalState(Solver.solveToInt(newHue, self._internalChroma, self._internalTone)) end function HCT:getChroma(): number - return self._internalChroma; + return self._internalChroma end function HCT:setChroma(newChroma: number): () - self:_setInternalState( - Solver.solveToInt( - self._internalHue, - newChroma, - self._internalTone - ) - ) + self:_setInternalState(Solver.solveToInt(self._internalHue, newChroma, self._internalTone)) end function HCT:getTone(): number - return self._internalTone; + return self._internalTone end function HCT:setTone(newTone: number): () - self:_setInternalState( - Solver.solveToInt( - self._internalHue, - self._internalChroma, - newTone - ) - ) + self:_setInternalState(Solver.solveToInt(self._internalHue, self._internalChroma, newTone)) end function HCT:_setInternalState(argb: number) - local cam = Cam16.fromInt(argb); - self._internalHue = cam.hue; - self._internalChroma = cam.chroma; - self._internalTone = ColorUtils.lstarFromArgb(argb); - self.argb = argb; + local cam = Cam16.fromInt(argb) + self._internalHue = cam.hue + self._internalChroma = cam.chroma + self._internalTone = ColorUtil.lstarFromArgb(argb) + self.argb = argb end function HCT:inViewingConditions(vc: ViewingConditions): HCT - local cam = Cam16.fromInt(self:toInt()); - local viewedInVc = cam.xyzInViewingConditions(vc); - local recastInVc = Cam16.fromXyzInViewingConditions( - viewedInVc[0], - viewedInVc[1], - viewedInVc[2], - ViewingConditions.make() - ); - local recastHct = HCT.from( - recastInVc.hue, - recastInVc.chroma, - ColorUtils.lstarFromY(viewedInVc[1]) - ); - return recastHct; + local cam = Cam16.fromInt(self:toInt()) + local viewedInVc = cam:xyzInViewingConditions(vc) + local recastInVc = Cam16.fromXyzInViewingConditions(viewedInVc[0], viewedInVc[1], viewedInVc[2], ViewingConditions.make()) + local recastHct = HCT.from(recastInVc.hue, recastInVc.chroma, ColorUtil.lstarFromY(viewedInVc[1])) + return recastHct end function HCT.new(argb: number): HCT - local cam = Cam16.fromInt(argb); + local cam = Cam16.fromInt(argb) local self: HCT = setmetatable({}, HCT) :: any - self._internalHue = cam.hue; - self._internalChroma = cam.chroma; - self._internalTone = ColorUtils.lstarFromArgb(argb); - self.argb = argb; + self._internalHue = cam.hue + self._internalChroma = cam.chroma + self._internalTone = ColorUtil.lstarFromArgb(argb) + self.argb = argb return self end function HCT.from(hue: number, chroma: number, tone: number): HCT - return HCT.new(Solver.solveToInt(hue, chroma, tone)); + return HCT.new(Solver.solveToInt(hue, chroma, tone)) end function HCT.fromInt(argb: number): HCT - return HCT.new(argb); + return HCT.new(argb) end -return HCT \ No newline at end of file +return HCT diff --git a/src/Theme/MathUtil.luau b/src/Theme/MathUtil.luau new file mode 100644 index 00000000..992d2e70 --- /dev/null +++ b/src/Theme/MathUtil.luau @@ -0,0 +1,76 @@ +--!strict +-- https://github.com/material-foundation/material-color-utilities/blob/f5d03da60c268b43928f3a24d6bf499e2564d39a/typescript/utils/math_utils.ts + +local Util = {} + +function Util.signum(num: number): number + if num < 0 then + return -1 + elseif num == 0 then + return 0 + else + return 1 + end +end + +function Util.lerp(start: number, stop: number, amount: number): number + return (1.0 - amount) * start + amount * stop +end + +function Util.clampInt(min: number, max: number, input: number): number + if input < min then + return min + elseif input > max then + return max + end + + return input +end + +function Util.clampDouble(min: number, max: number, input: number): number + if input < min then + return min + elseif input > max then + return max + end + + return input +end + +function Util.sanitizeDegreesInt(degrees: number): number + degrees = degrees % 360 + if degrees < 0 then + degrees = degrees + 360 + end + return degrees +end + +function Util.sanitizeDegreesDouble(degrees: number): number + degrees = degrees % 360.0 + if degrees < 0 then + degrees = degrees + 360.0 + end + return degrees +end + +function Util.rotationDirection(from: number, to: number): number + local increasingDifference = Util.sanitizeDegreesDouble(to - from) + return if increasingDifference <= 180.0 then 1.0 else -1.0 +end + +function Util.differenceDegrees(a: number, b: number): number + return 180.0 - math.abs(math.abs(a - b) - 180.0) +end + +function Util.matrixMultiply(row: { number }, matrix: { { number } }): { number } + local a = row[0] * matrix[0][0] + row[1] * matrix[0][1] + row[2] * matrix[0][2] + local b = row[0] * matrix[1][0] + row[1] * matrix[1][1] + row[2] * matrix[1][2] + local c = row[0] * matrix[2][0] + row[1] * matrix[2][1] + row[2] * matrix[2][2] + return { + [0]=a, + [1]=b, + [2]=c + } +end + +return Util diff --git a/src/Theme/Palettes/Core.luau b/src/Theme/Palettes/Core.luau new file mode 100644 index 00000000..8b15732d --- /dev/null +++ b/src/Theme/Palettes/Core.luau @@ -0,0 +1,97 @@ +--!strict +-- https://github.com/material-foundation/material-color-utilities/blob/f5d03da60c268b43928f3a24d6bf499e2564d39a/typescript/palettes/core_palette.ts +local HCT = require(script.Parent.Parent:WaitForChild("HCT")) +local TonalPalette = require(script.Parent:WaitForChild("Tonal")) + +export type TonalPalette = TonalPalette.TonalPalette +type HCT = HCT.HCT + +export type CorePaletteColors = { + primary: number, + secondary: number?, + tertiary: number?, + neutral: number?, + neutralVariant: number?, + error: number?, +} + +export type CorePalette = { + __index: CorePalette, + a1: TonalPalette, + a2: TonalPalette, + a3: TonalPalette, + n1: TonalPalette, + n2: TonalPalette, + error: TonalPalette, +} + +local CorePalette = {} +CorePalette.__index = CorePalette + +function CorePalette.of(argb: number): CorePalette + return CorePalette.new(argb, false) +end + +function CorePalette.contentOf(argb: number): CorePalette + return CorePalette.new(argb, true) +end + +function CorePalette.fromColors(colors: CorePaletteColors): CorePalette + return CorePalette.createPaletteFromColors(false, colors) +end + +function CorePalette.contentFromColors(colors: CorePaletteColors): CorePalette + return CorePalette.createPaletteFromColors(true, colors) +end + +function CorePalette.createPaletteFromColors(content: boolean, colors: CorePaletteColors): CorePalette + local palette = CorePalette.new(colors.primary, content) + if colors.secondary then + local p = CorePalette.new(colors.secondary, content) + palette.a2 = p.a1 + end + if colors.tertiary then + local p = CorePalette.new(colors.tertiary, content) + palette.a3 = p.a1 + end + if colors.error then + local p = CorePalette.new(colors.error, content) + palette.error = p.a1 + end + if colors.neutral then + local p = CorePalette.new(colors.neutral, content) + palette.n1 = p.n1 + end + if colors.neutralVariant then + local p = CorePalette.new(colors.neutralVariant, content) + palette.n2 = p.n2 + end + return palette +end + +function CorePalette.new(argb: number, isContent: boolean) + local hct = HCT.fromInt(argb) + local hue = hct:getHue() + local chroma = hct:getChroma() + + local self: CorePalette = setmetatable({}, CorePalette) :: any + + if isContent then + self.a1 = TonalPalette.fromHueAndChroma(hue, chroma) + self.a2 = TonalPalette.fromHueAndChroma(hue, chroma / 3) + self.a3 = TonalPalette.fromHueAndChroma(hue + 60, chroma / 2) + self.n1 = TonalPalette.fromHueAndChroma(hue, math.min(chroma / 12, 4)) + self.n2 = TonalPalette.fromHueAndChroma(hue, math.min(chroma / 6, 8)) + else + self.a1 = TonalPalette.fromHueAndChroma(hue, math.max(48, chroma)) + self.a2 = TonalPalette.fromHueAndChroma(hue, 16) + self.a3 = TonalPalette.fromHueAndChroma(hue + 60, 24) + self.n1 = TonalPalette.fromHueAndChroma(hue, 4) + self.n2 = TonalPalette.fromHueAndChroma(hue, 8) + end + self.error = TonalPalette.fromHueAndChroma(25, 84) + + return self +end + +return CorePalette \ No newline at end of file diff --git a/src/Theme/Palettes/Tonal.luau b/src/Theme/Palettes/Tonal.luau new file mode 100644 index 00000000..d52d3ff6 --- /dev/null +++ b/src/Theme/Palettes/Tonal.luau @@ -0,0 +1,98 @@ +--!strict +-- https://github.com/material-foundation/material-color-utilities/blob/f5d03da60c268b43928f3a24d6bf499e2564d39a/typescript/palettes/tonal_palette.ts +local HCT = require(script.Parent.Parent:WaitForChild("HCT")) + +type HCT = HCT.HCT +export type TonalPalette = { + __index: TonalPalette, + cache: { [number]: number }, + hue: number, + chroma: number, + keyColor: HCT, + fromInt: (argb: number) -> TonalPalette, + fromHct: (hct: HCT) -> TonalPalette, + fromHueAndChroma: (hue: number, chroma: number) -> TonalPalette, + new: (hue: number, chroma: number, keyColor: HCT) -> TonalPalette, + createKeyColor: (hue: number, chroma: number) -> HCT, + getTone: (self: TonalPalette, tone: number) -> number, + getHCT: (self: TonalPalette, tone: number) -> HCT, +} + +local TonalPalette = {} :: TonalPalette +TonalPalette.__index = TonalPalette + +function TonalPalette.fromInt(argb: number): TonalPalette + local hct = HCT.fromInt(argb) + return TonalPalette.fromHct(hct) +end + +function TonalPalette.fromHct(hct: HCT): TonalPalette + return TonalPalette.new(hct:getHue(), hct:getChroma(), hct) +end + +function TonalPalette.fromHueAndChroma(hue: number, chroma: number): TonalPalette + return TonalPalette.new(hue, chroma, TonalPalette.createKeyColor(hue, chroma)) +end + +function TonalPalette.new(hue: number, chroma: number, keyColor: HCT): TonalPalette + local self: TonalPalette = setmetatable({}, TonalPalette) :: any + self.hue = hue + self.chroma = chroma + self.keyColor = keyColor + self.cache = {} + return self +end + +function TonalPalette.createKeyColor(hue: number, chroma: number): HCT + local startTone = 50.0 + local smallestDeltaHct = HCT.from(hue, chroma, startTone) + local smallestDelta = math.abs(smallestDeltaHct:getChroma() - chroma) + -- Starting from T50, check T+/-delta to see if they match the requested + -- chroma. + -- + -- Starts from T50 because T50 has the most chroma available, on + -- average. Thus it is most likely to have a direct answer and minimize + -- iteration. + for delta = 1.0, 50.0 - 1, 1.0 do + -- Termination condition rounding instead of minimizing delta to avoid + -- case where requested chroma is 16.51, and the closest chroma is 16.49. + -- Error is minimized, but when rounded and displayed, requested chroma + -- is 17, key color's chroma is 16. + if math.round(chroma) == math.round(smallestDeltaHct:getChroma()) then + return smallestDeltaHct + end + + local hctAdd = HCT.from(hue, chroma, startTone + delta) + local hctAddDelta = math.abs(hctAdd:getChroma() - chroma) + if hctAddDelta < smallestDelta then + smallestDelta = hctAddDelta + smallestDeltaHct = hctAdd + end + + local hctSubtract = HCT.from(hue, chroma, startTone - delta) + local hctSubtractDelta = math.abs(hctSubtract:getChroma() - chroma) + if hctSubtractDelta < smallestDelta then + smallestDelta = hctSubtractDelta + smallestDeltaHct = hctSubtract + end + end + + return smallestDeltaHct +end + +function TonalPalette:getTone(tone: number): number + local argb = self.cache[tone] -- self.cache.get(tone); + + if argb == nil then + argb = HCT.from(self.hue, self.chroma, tone):toInt() + self.cache[tone] = argb + end + + return argb +end + +function TonalPalette:getHCT(tone: number): HCT + return HCT.fromInt(self:getTone(tone)) +end + +return TonalPalette diff --git a/src/Theme/Scheme/init.luau b/src/Theme/Scheme/init.luau new file mode 100644 index 00000000..dd7455e2 --- /dev/null +++ b/src/Theme/Scheme/init.luau @@ -0,0 +1,149 @@ +--!strict +-- https://github.com/material-foundation/material-color-utilities/blob/f5d03da60c268b43928f3a24d6bf499e2564d39a/typescript/scheme/scheme.ts + +local CorePalette = require(script.Parent:WaitForChild("Palettes"):WaitForChild("Core")) +type TonalPalette = CorePalette.TonalPalette +type CorePalette = CorePalette.CorePalette +export type SchemeData = { + primary: number, + onPrimary: number, + primaryContainer: number, + onPrimaryContainer: number, + secondary: number, + onSecondary: number, + secondaryContainer: number, + onSecondaryContainer: number, + tertiary: number, + onTertiary: number, + tertiaryContainer: number, + onTertiaryContainer: number, + error: number, + onError: number, + errorContainer: number, + onErrorContainer: number, + background: number, + onBackground: number, + surface: number, + onSurface: number, + surfaceVariant: number, + onSurfaceVariant: number, + outline: number, + outlineVariant: number, + shadow: number, + scrim: number, + inverseSurface: number, + inverseOnSurface: number, + inversePrimary: number, +} + +export type Scheme = { + __index: Scheme, + new: (data: SchemeData) -> Scheme, + light: (argb: number) -> Scheme, + dark: (argb: number) -> Scheme, + lightContent: (argb: number) -> Scheme, + darkContent: (argb: number) -> Scheme, + lightFromCorePalette: (core: CorePalette) -> Scheme, + darkFromCorePalette: (core: CorePalette) -> Scheme, + toJSON: (self: Scheme) -> SchemeData, + +} & SchemeData + +local Scheme = {} :: Scheme +Scheme.__index = Scheme + +function Scheme:toJSON(): SchemeData + local data: SchemeData = table.clone(self) :: any + return data +end + +function Scheme.light(argb: number): Scheme + return Scheme.lightFromCorePalette(CorePalette.of(argb)); +end + +function Scheme.dark(argb: number): Scheme + return Scheme.darkFromCorePalette(CorePalette.of(argb)); +end + +function Scheme.lightContent(argb: number): Scheme + return Scheme.lightFromCorePalette(CorePalette.contentOf(argb)); +end + +function Scheme.darkContent(argb: number): Scheme + return Scheme.darkFromCorePalette(CorePalette.contentOf(argb)); +end + +function Scheme.lightFromCorePalette(core: CorePalette): Scheme + return Scheme.new({ + primary= core.a1:getTone(40), + onPrimary= core.a1:getTone(100), + primaryContainer= core.a1:getTone(90), + onPrimaryContainer= core.a1:getTone(10), + secondary= core.a2:getTone(40), + onSecondary= core.a2:getTone(100), + secondaryContainer= core.a2:getTone(90), + onSecondaryContainer= core.a2:getTone(10), + tertiary= core.a3:getTone(40), + onTertiary= core.a3:getTone(100), + tertiaryContainer= core.a3:getTone(90), + onTertiaryContainer= core.a3:getTone(10), + error= core.error:getTone(40), + onError= core.error:getTone(100), + errorContainer= core.error:getTone(90), + onErrorContainer= core.error:getTone(10), + background= core.n1:getTone(99), + onBackground= core.n1:getTone(10), + surface= core.n1:getTone(99), + onSurface= core.n1:getTone(10), + surfaceVariant= core.n2:getTone(90), + onSurfaceVariant= core.n2:getTone(30), + outline= core.n2:getTone(50), + outlineVariant= core.n2:getTone(80), + shadow= core.n1:getTone(0), + scrim= core.n1:getTone(0), + inverseSurface= core.n1:getTone(20), + inverseOnSurface= core.n1:getTone(95), + inversePrimary= core.a1:getTone(80) + }); +end + +function Scheme.darkFromCorePalette(core: CorePalette): Scheme + return Scheme.new({ + primary= core.a1:getTone(80), + onPrimary= core.a1:getTone(20), + primaryContainer= core.a1:getTone(30), + onPrimaryContainer= core.a1:getTone(90), + secondary= core.a2:getTone(80), + onSecondary= core.a2:getTone(20), + secondaryContainer= core.a2:getTone(30), + onSecondaryContainer= core.a2:getTone(90), + tertiary= core.a3:getTone(80), + onTertiary= core.a3:getTone(20), + tertiaryContainer= core.a3:getTone(30), + onTertiaryContainer= core.a3:getTone(90), + error= core.error:getTone(80), + onError= core.error:getTone(20), + errorContainer= core.error:getTone(30), + onErrorContainer= core.error:getTone(80), + background= core.n1:getTone(10), + onBackground= core.n1:getTone(90), + surface= core.n1:getTone(10), + onSurface= core.n1:getTone(90), + surfaceVariant= core.n2:getTone(30), + onSurfaceVariant= core.n2:getTone(80), + outline= core.n2:getTone(60), + outlineVariant= core.n2:getTone(30), + shadow= core.n1:getTone(0), + scrim= core.n1:getTone(0), + inverseSurface= core.n1:getTone(90), + inverseOnSurface= core.n1:getTone(20), + inversePrimary= core.a1:getTone(40) + }); +end + +function Scheme.new(data: SchemeData): Scheme + local self: Scheme = setmetatable(table.clone(data), Scheme) :: any + return self +end + +return Scheme \ No newline at end of file diff --git a/src/Theme/Test.story.luau b/src/Theme/Test.story.luau new file mode 100644 index 00000000..1d20dabf --- /dev/null +++ b/src/Theme/Test.story.luau @@ -0,0 +1,59 @@ +--!strict +-- Services +-- Packages +local Maid = require(game:GetService("ReplicatedStorage"):WaitForChild("Packages"):WaitForChild("Maid")) +-- Modules +-- Types +-- Constants +-- Variables +-- References +-- Class +return function(frame: Frame) + local maid = Maid.new() + task.spawn(function() + local Theme = require(script.Parent) + local theme = Theme.new( + Color3.new(0,0.5,0.15), + {} + ) + + local function displayScheme(scheme: Theme.Scheme): Frame + local halfFrame = maid:GiveTask(Instance.new("Frame")) + + local listLayout = maid:GiveTask(Instance.new("UIListLayout")) + listLayout.FillDirection = Enum.FillDirection.Vertical + listLayout.Padding = UDim.new(0.01, 0) + listLayout.VerticalAlignment = Enum.VerticalAlignment.Center + listLayout.HorizontalAlignment = Enum.HorizontalAlignment.Center + listLayout.Parent = halfFrame + + for k, v in pairs(scheme) do + local label = Instance.new("TextLabel") + label.TextColor3 = Color3.new(0.5,0.5,0.5) + label.Text = k + label.BackgroundColor3 = v + label.Size = UDim2.fromScale(0.9, 1/30) + label.TextScaled = true + label.Parent = halfFrame + end + + return halfFrame + end + + local light = displayScheme(theme.Schemes.Light) + light.BackgroundColor3 = Color3.new(0.85, 0.85, 0.85) + light.Position = UDim2.fromScale(0,0) + light.Size = UDim2.fromScale(0.5,1) + light.Parent = frame + + local dark = displayScheme(theme.Schemes.Dark) + dark.BackgroundColor3 = Color3.new(0.15, 0.15, 0.15) + dark.Position = UDim2.fromScale(0.5,0) + dark.Size = UDim2.fromScale(0.5,1) + dark.Parent = frame + + end) + return function() + maid:Destroy() + end +end \ No newline at end of file diff --git a/src/Color/init.luau b/src/Theme/ThemeUtil.luau similarity index 64% rename from src/Color/init.luau rename to src/Theme/ThemeUtil.luau index 20e98cd8..b64cd4b1 100644 --- a/src/Color/init.luau +++ b/src/Theme/ThemeUtil.luau @@ -1,12 +1,12 @@ --!strict -- https://github.com/material-foundation/material-color-utilities/blob/f5d03da60c268b43928f3a24d6bf499e2564d39a/typescript/utils/theme_utils.ts#L77 -local Blend = require(script:WaitForChild("Blend")) -local CorePalette = require(script:WaitForChild("Palettes"):WaitForChild("Core")) -local TonalPalette = require(script:WaitForChild("Palettes"):WaitForChild("Tonal")) -local Scheme = require(script:WaitForChild("Scheme")) +local Blend = require(script.Parent:WaitForChild("Blend")) +local CorePalette = require(script.Parent:WaitForChild("Palettes"):WaitForChild("Core")) +local TonalPalette = require(script.Parent:WaitForChild("Palettes"):WaitForChild("Tonal")) +local Scheme = require(script.Parent:WaitForChild("Scheme")) -type Scheme = Scheme.Scheme -type TonalPalette = TonalPalette.TonalPalette +export type Scheme = Scheme.Scheme +export type TonalPalette = TonalPalette.TonalPalette export type CustomColor = { value: number, name: string, @@ -63,15 +63,27 @@ function Util.themeFromSourceColor(source: number, customColors: { CustomColor } customColors = (function(): { CustomColorGroup } local out: { CustomColorGroup } = {} for i, c in ipairs(customColors) do - out[i] = Util.customColor(source, c) + out[i] = Util.customColorGroup(source, c) end return out end)(), } end +function Util.customColor( + value: number, + name: string, + blend: boolean +): CustomColor + return { + value = value, + name = name, + blend = blend + } +end + -- Generate custom color group from source and target color -function Util.customColor(source: number, color: CustomColor): CustomColorGroup +function Util.customColorGroup(source: number, color: CustomColor): CustomColorGroup local value = color.value local from = value local to = source @@ -84,16 +96,16 @@ function Util.customColor(source: number, color: CustomColor): CustomColorGroup color = color, value = value, light = { - color = tones.tone(40), - onColor = tones.tone(100), - colorContainer = tones.tone(90), - onColorContainer = tones.tone(10), + color = tones:getTone(40), + onColor = tones:getTone(100), + colorContainer = tones:getTone(90), + onColorContainer = tones:getTone(10), }, dark = { - color = tones.tone(80), - onColor = tones.tone(20), - colorContainer = tones.tone(30), - onColorContainer = tones.tone(90), + color = tones:getTone(80), + onColor = tones:getTone(20), + colorContainer = tones:getTone(30), + onColorContainer = tones:getTone(90), }, } end diff --git a/src/Theme/ViewingConditions.luau b/src/Theme/ViewingConditions.luau new file mode 100644 index 00000000..82f8987f --- /dev/null +++ b/src/Theme/ViewingConditions.luau @@ -0,0 +1,120 @@ +--!strict +-- https://github.com/material-foundation/material-color-utilities/blob/f5d03da60c268b43928f3a24d6bf499e2564d39a/typescript/hct/viewing_conditions.ts +local MathUtil = require(script.Parent:WaitForChild("MathUtil")) +local ColorUtil = require(script.Parent:WaitForChild("ColorUtil")) + +export type ViewingConditions = { + __index: ViewingConditions, + DEFAULT: ViewingConditions, + n: number, aw: number, nbb: number, + ncb: number, c: number, nc: number, + rgbD: {number}, fl: number, fLRoot: number, + z: number, + make: ( + whitePoint: {number}?, + adaptingLuminance: number?, + backgroundLstar: number?, + surround: number?, + discountingIlluminant: boolean? + ) -> ViewingConditions, + new: ( + n: number, aw: number, nbb: number, + ncb: number, c: number, nc: number, + rgbD: {number}, fl: number, fLRoot: number, + z: number + ) -> ViewingConditions, +} + +local ViewingConditions = {} :: ViewingConditions +ViewingConditions.__index = ViewingConditions + + +function ViewingConditions.make( + whitePoint: {number}?, + adaptingLuminance: number?, + backgroundLstar: number?, + surround: number?, + discountingIlluminant: boolean? +): ViewingConditions + + whitePoint = whitePoint or ColorUtil.whitePointD65() + assert(whitePoint) + adaptingLuminance = adaptingLuminance or (200.0 / math.pi) * ColorUtil.yFromLstar(50.0) / 100.0 + assert(adaptingLuminance) + backgroundLstar = backgroundLstar or 50.0 + assert(backgroundLstar) + surround = surround or 2.0 + assert(surround) + discountingIlluminant = if discountingIlluminant == nil then false else discountingIlluminant + assert(discountingIlluminant ~= nil) + + local xyz = whitePoint; + local rW = xyz[0] * 0.401288 + xyz[1] * 0.650173 + xyz[2] * -0.051461; + local gW = xyz[0] * -0.250268 + xyz[1] * 1.204414 + xyz[2] * 0.045854; + local bW = xyz[0] * -0.002079 + xyz[1] * 0.048952 + xyz[2] * 0.953127; + local f = 0.8 + surround / 10.0; + + local c = if f >= 0.9 then MathUtil.lerp(0.59, 0.69, (f - 0.9) * 10.0) else + MathUtil.lerp(0.525, 0.59, (f - 0.8) * 10.0); + local d = if discountingIlluminant then + 1.0 else + f * (1.0 - (1.0 / 3.6) * math.exp((-adaptingLuminance - 42.0) / 92.0)); + + d = if d > 1.0 then 1.0 elseif d < 0.0 then 0.0 else d; + + local nc = f; + local rgbD = { + [0]=d * (100.0 / rW) + 1.0 - d, + [1]=d * (100.0 / gW) + 1.0 - d, + [2]=d * (100.0 / bW) + 1.0 - d, + }; + local k = 1.0 / (5.0 * adaptingLuminance + 1.0); + local k4 = k * k * k * k; + local k4F = 1.0 - k4; + + local fl = k4 * adaptingLuminance + + 0.1 * k4F * k4F * ((5.0 * adaptingLuminance)^(1/3)); + + local n = ColorUtil.yFromLstar(backgroundLstar) / whitePoint[1]; + local z = 1.48 + math.sqrt(n); + local nbb = 0.725 / math.pow(n, 0.2); + local ncb = nbb; + local rgbAFactors = { + [0]=math.pow((fl * rgbD[0] * rW) / 100.0, 0.42), + [1]=math.pow((fl * rgbD[1] * gW) / 100.0, 0.42), + [2]=math.pow((fl * rgbD[2] * bW) / 100.0, 0.42), + }; + local rgbA = { + [0]=(400.0 * rgbAFactors[0]) / (rgbAFactors[0] + 27.13), + [1]=(400.0 * rgbAFactors[1]) / (rgbAFactors[1] + 27.13), + [2]=(400.0 * rgbAFactors[2]) / (rgbAFactors[2] + 27.13), + }; + local aw = (2.0 * rgbA[0] + rgbA[1] + 0.05 * rgbA[2]) * nbb; + return ViewingConditions.new(n, aw, nbb, ncb, c, nc, rgbD, fl, math.pow(fl, 0.25), z); +end + +function ViewingConditions.new( + n: number, aw: number, nbb: number, + ncb: number, c: number, nc: number, + rgbD: {number}, fl: number, fLRoot: number, + z: number +): ViewingConditions + + local self: ViewingConditions = setmetatable({}, ViewingConditions) :: any + self.n = n + self.aw = aw + self.nbb = nbb + self.ncb = ncb + self.c = c + self.nc = nc + self.rgbD = rgbD + self.fl = fl + self.fLRoot = fLRoot + self.z = z + + return self +end + +ViewingConditions.DEFAULT = ViewingConditions.make(); + +return ViewingConditions \ No newline at end of file diff --git a/src/Theme/init.luau b/src/Theme/init.luau new file mode 100644 index 00000000..8e04eecf --- /dev/null +++ b/src/Theme/init.luau @@ -0,0 +1,307 @@ +--!strict +-- Services +-- Packages +-- Modules +local ThemeUtil = require(script:WaitForChild("ThemeUtil")) +local HCT = require(script:WaitForChild("HCT")) + +-- Types +type GoogleHCT = HCT.HCT +type GoogleCustomColor = ThemeUtil.CustomColor +type GoogleTheme = ThemeUtil.Theme +type GoogleScheme = ThemeUtil.Scheme +type GoogleTonalPalette = ThemeUtil.TonalPalette +type GoogleColorGroup = ThemeUtil.ColorGroup +export type Scheme = { + Primary: Color3, + OnPrimary: Color3, + PrimaryContainer: Color3, + OnPrimaryContainer: Color3, + Secondary: Color3, + OnSecondary: Color3, + SecondaryContainer: Color3, + OnSecondaryContainer: Color3, + Tertiary: Color3, + OnTertiary: Color3, + TertiaryContainer: Color3, + OnTertiaryContainer: Color3, + Error: Color3, + OnError: Color3, + ErrorContainer: Color3, + OnErrorContainer: Color3, + Background: Color3, + OnBackground: Color3, + Surface: Color3, + OnSurface: Color3, + SurfaceVariant: Color3, + OnSurfaceVariant: Color3, + Outline: Color3, + OutlineVariant: Color3, + Shadow: Color3, + Scrim: Color3, + InverseSurface: Color3, + InverseOnSurface: Color3, + InversePrimary: Color3, +} +export type TonalPalette = { + [number]: Color3 +} +export type ColorGroup = { + Color: Color3, + OnColor: Color3, + ColorContainer: Color3, + OnColorContainer: Color3, +} +export type CustomColorGroup = { + Name: string, + Value: number, + IsBlended: boolean, + Light: ColorGroup, + Dark: ColorGroup, +} +export type Theme = { + Source: Color3, + Schemes: { + Light: Scheme, + Dark: Scheme + }, + Palettes: { + Primary: TonalPalette, + Secondary: TonalPalette, + Tertiary: TonalPalette, + Neutral: TonalPalette, + NeutralVariant: TonalPalette, + Error: TonalPalette, + }, + CustomColors: { + [string]: CustomColorGroup + }, +} +-- Constants +-- Variables +-- References +-- Private Functions +function toHCT(color: Color3): GoogleHCT + local function rgbToXyz(r: number, g: number, b: number): (number, number, number) + -- Assuming sRGB color space and using a common conversion formula + r = (r > 0.04045) and ((r + 0.055) / 1.055) ^ 2.4 or r / 12.92 + g = (g > 0.04045) and ((g + 0.055) / 1.055) ^ 2.4 or g / 12.92 + b = (b > 0.04045) and ((b + 0.055) / 1.055) ^ 2.4 or b / 12.92 + + -- Convert to XYZ using the RGB to XYZ matrix for sRGB + local x = r * 0.4124564 + g * 0.3575761 + b * 0.1804375 + local y = r * 0.2126729 + g * 0.7151522 + b * 0.0721750 + local z = r * 0.0193339 + g * 0.1191920 + b * 0.9503041 + + return x, y, z + end + + local function xyzToLab(x: number, y: number, z: number): (number, number, number) + -- Observer = 2°, Illuminant = D65 + local refX, refY, refZ = 0.95047, 1.00000, 1.08883 + x = x / refX + y = y / refY + z = z / refZ + + x = (x > 0.008856) and x ^ (1/3) or (7.787 * x) + (16 / 116) + y = (y > 0.008856) and y ^ (1/3) or (7.787 * y) + (16 / 116) + z = (z > 0.008856) and z ^ (1/3) or (7.787 * z) + (16 / 116) + + local l = (116 * y) - 16 + local a = 500 * (x - y) + local b = 200 * (y - z) + + return l, a, b + end + + local function labToHct(l: number, a: number, b: number): (number, number, number) + -- Convert LAB to HCT (Hue, Chroma, Tone) + local hue = math.deg(math.atan2(b, a)) + if hue < 0 then hue = hue + 360 end + + local chroma = math.sqrt(a^2 + b^2) + local tone = l -- In LAB, L* represents lightness which is analogous to tone + + return hue, chroma, tone + end + + return HCT.from(labToHct(xyzToLab(rgbToXyz(color.R, color.G, color.B)))) +end + +function toColor3(hct: GoogleHCT): Color3 + local function hctToLab(hue: number, chroma: number, tone: number): (number, number, number) + -- Convert HCT back to LAB + local a = chroma * math.cos(math.rad(hue)) + local b = chroma * math.sin(math.rad(hue)) + local l = tone -- In LAB, L* represents lightness which is analogous to tone + return l, a, b + end + + local function labToXyz(l: number, a: number, b: number): (number, number, number) + local y = (l + 16) / 116 + local x = a / 500 + y + local z = y - b / 200 + + -- Observer= 2°, Illuminant= D65 + local refX, refY, refZ = 0.95047, 1.00000, 1.08883 + x = (x ^ 3 > 0.008856) and x ^ 3 or (x - 16 / 116) / 7.787 + y = (y ^ 3 > 0.008856) and y ^ 3 or (y - 16 / 116) / 7.787 + z = (z ^ 3 > 0.008856) and z ^ 3 or (z - 16 / 116) / 7.787 + + x = refX * x + y = refY * y + z = refZ * z + + return x, y, z + end + + local function xyzToRgb(x: number, y: number, z: number): (number, number, number) + -- Convert XYZ to RGB + local r = x * 3.2406 + y * -1.5372 + z * -0.4986 + local g = x * -0.9689 + y * 1.8758 + z * 0.0415 + local b = x * 0.0557 + y * -0.2040 + z * 1.0570 + + r = (r > 0.0031308) and 1.055 * (r ^ (1 / 2.4)) - 0.055 or 12.92 * r + g = (g > 0.0031308) and 1.055 * (g ^ (1 / 2.4)) - 0.055 or 12.92 * g + b = (b > 0.0031308) and 1.055 * (b ^ (1 / 2.4)) - 0.055 or 12.92 * b + + -- Clamp the values to the 0-1 range + r = math.max(0, math.min(1, r)) + g = math.max(0, math.min(1, g)) + b = math.max(0, math.min(1, b)) + + return r, g, b + end + return Color3.new(xyzToRgb(labToXyz(hctToLab(hct:getHue(), hct:getChroma(), hct:getTone())))) +end + +-- Class +local Theme = {} + +function Theme.new( + source: Color3, + custom: {[string]: Color3}, + blend: {[string]: boolean}? +): Theme + local googleTheme: GoogleTheme + do + local customColors: {[number]: GoogleCustomColor} = {} + for k, color in pairs(custom) do + table.insert(customColors, ThemeUtil.customColor( + toHCT(source):toInt(), + k, + if blend and blend[k] ~= nil then blend[k] else false + )) + end + + googleTheme = ThemeUtil.themeFromSourceColor( + toHCT(source):toInt(), + customColors + ) + + end + + local lightScheme: Scheme + local darkScheme: Scheme + do + local function fromScheme(scheme: GoogleScheme): Scheme + return { + Primary = toColor3(HCT.fromInt(scheme.primary)), + OnPrimary = toColor3(HCT.fromInt(scheme.onPrimary)), + PrimaryContainer = toColor3(HCT.fromInt(scheme.primary)), + OnPrimaryContainer = toColor3(HCT.fromInt(scheme.onPrimaryContainer)), + Secondary = toColor3(HCT.fromInt(scheme.secondary)), + OnSecondary = toColor3(HCT.fromInt(scheme.onSecondary)), + SecondaryContainer = toColor3(HCT.fromInt(scheme.secondaryContainer)), + OnSecondaryContainer = toColor3(HCT.fromInt(scheme.onSecondaryContainer)), + Tertiary = toColor3(HCT.fromInt(scheme.tertiary)), + OnTertiary = toColor3(HCT.fromInt(scheme.onTertiary)), + TertiaryContainer = toColor3(HCT.fromInt(scheme.tertiaryContainer)), + OnTertiaryContainer = toColor3(HCT.fromInt(scheme.onTertiaryContainer)), + Error = toColor3(HCT.fromInt(scheme.error)), + OnError = toColor3(HCT.fromInt(scheme.onError)), + ErrorContainer = toColor3(HCT.fromInt(scheme.errorContainer)), + OnErrorContainer = toColor3(HCT.fromInt(scheme.onErrorContainer)), + Background = toColor3(HCT.fromInt(scheme.background)), + OnBackground = toColor3(HCT.fromInt(scheme.onBackground)), + Surface = toColor3(HCT.fromInt(scheme.surface)), + OnSurface = toColor3(HCT.fromInt(scheme.onSurface)), + SurfaceVariant = toColor3(HCT.fromInt(scheme.surfaceVariant)), + OnSurfaceVariant = toColor3(HCT.fromInt(scheme.onSurfaceVariant)), + Outline = toColor3(HCT.fromInt(scheme.outline)), + OutlineVariant = toColor3(HCT.fromInt(scheme.outlineVariant)), + Shadow = toColor3(HCT.fromInt(scheme.shadow)), + Scrim = toColor3(HCT.fromInt(scheme.scrim)), + InverseSurface = toColor3(HCT.fromInt(scheme.inverseSurface)), + InverseOnSurface = toColor3(HCT.fromInt(scheme.inverseOnSurface)), + InversePrimary = toColor3(HCT.fromInt(scheme.inversePrimary)), + } + end + lightScheme = fromScheme(googleTheme.schemes.light) + darkScheme = fromScheme(googleTheme.schemes.dark) + end + + local primaryPalette: TonalPalette + local secondaryPalette: TonalPalette + local tertiaryPalette: TonalPalette + local neutralPalette: TonalPalette + local neutralVariantPalette: TonalPalette + local errorPalette: TonalPalette + do + local function fromPalette(tonalPalette: GoogleTonalPalette): TonalPalette + local out: {[number]: Color3} = {} + for k, v in pairs(tonalPalette.cache) do + out[k] = toColor3(HCT.fromInt(v)) + end + return out + end + primaryPalette = fromPalette(googleTheme.palettes.primary) + secondaryPalette = fromPalette(googleTheme.palettes.secondary) + tertiaryPalette = fromPalette(googleTheme.palettes.tertiary) + neutralPalette = fromPalette(googleTheme.palettes.neutral) + neutralVariantPalette = fromPalette(googleTheme.palettes.neutralVariant) + errorPalette = fromPalette(googleTheme.palettes.error) + end + + local customColors: {[string]: CustomColorGroup} = {} + do + local function fromColorGroup(group: GoogleColorGroup): ColorGroup + return { + Color = toColor3(HCT.fromInt(group.color)), + OnColor = toColor3(HCT.fromInt(group.onColor)), + ColorContainer = toColor3(HCT.fromInt(group.colorContainer)), + OnColorContainer = toColor3(HCT.fromInt(group.onColorContainer)), + } + end + for i, colorGroup in pairs(googleTheme.customColors) do + customColors[colorGroup.color.name] = { + Name = colorGroup.color.name, + Value = colorGroup.value, + IsBlended = colorGroup.color.blend, + Light = fromColorGroup(colorGroup.light), + Dark = fromColorGroup(colorGroup.dark), + } + end + end + + local theme: Theme = { + Source = source, + Schemes = { + Light = lightScheme, + Dark = darkScheme + }, + Palettes = { + Primary = primaryPalette, + Secondary = secondaryPalette, + Tertiary = tertiaryPalette, + Neutral = neutralPalette, + NeutralVariant = neutralVariantPalette, + Error = errorPalette, + }, + CustomColors = customColors, + } + + return theme +end + +return Theme \ No newline at end of file From 26a20f18cbdd383e9fc62947011c207aa848e787 Mon Sep 17 00:00:00 2001 From: Nightcycle <77173389+nightcycle@users.noreply.github.com> Date: Thu, 7 Dec 2023 18:43:40 -0500 Subject: [PATCH 20/57] sorted demo by order --- src/Theme/Test.story.luau | 39 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/src/Theme/Test.story.luau b/src/Theme/Test.story.luau index 1d20dabf..a3e0ab18 100644 --- a/src/Theme/Test.story.luau +++ b/src/Theme/Test.story.luau @@ -5,6 +5,37 @@ local Maid = require(game:GetService("ReplicatedStorage"):WaitForChild("Packages -- Modules -- Types -- Constants +local ORDER = { + "Primary", + "OnPrimary", + "PrimaryContainer", + "OnPrimaryContainer", + "Secondary", + "OnSecondary", + "SecondaryContainer", + "OnSecondaryContainer", + "Tertiary", + "OnTertiary", + "TertiaryContainer", + "OnTertiaryContainer", + "Error", + "OnError", + "ErrorContainer", + "OnErrorContainer", + "Background", + "OnBackground", + "Surface", + "OnSurface", + "SurfaceVariant", + "OnSurfaceVariant", + "Outline", + "OutlineVariant", + "Shadow", + "Scrim", + "InverseSurface", + 'InverseOnSurface', + "InversePrimary", +} -- Variables -- References -- Class @@ -13,7 +44,7 @@ return function(frame: Frame) task.spawn(function() local Theme = require(script.Parent) local theme = Theme.new( - Color3.new(0,0.5,0.15), + Color3.new(0.8,0,0.8), {} ) @@ -23,6 +54,7 @@ return function(frame: Frame) local listLayout = maid:GiveTask(Instance.new("UIListLayout")) listLayout.FillDirection = Enum.FillDirection.Vertical listLayout.Padding = UDim.new(0.01, 0) + listLayout.SortOrder = Enum.SortOrder.LayoutOrder listLayout.VerticalAlignment = Enum.VerticalAlignment.Center listLayout.HorizontalAlignment = Enum.HorizontalAlignment.Center listLayout.Parent = halfFrame @@ -32,7 +64,10 @@ return function(frame: Frame) label.TextColor3 = Color3.new(0.5,0.5,0.5) label.Text = k label.BackgroundColor3 = v - label.Size = UDim2.fromScale(0.9, 1/30) + local i = table.find(ORDER, k) + assert(i, `bad order for {k}`) + label.LayoutOrder = i + label.Size = UDim2.fromScale(0.9, 1/50) label.TextScaled = true label.Parent = halfFrame end From 92e7a71361f12333b9e5edf4eac2610e845a845a Mon Sep 17 00:00:00 2001 From: Nightcycle <77173389+nightcycle@users.noreply.github.com> Date: Fri, 8 Dec 2023 14:27:08 -0500 Subject: [PATCH 21/57] Set up basic style system need to integrate into components --- pseudo-enum.toml | 55 +++ sourcemap.json | 2 +- src/Component/Button/Base.luau | 148 ++++---- src/Component/Button/TextButton/init.luau | 153 ++++----- src/Enums.luau | 303 +++++++++++++++-- src/Style.luau | 47 +++ src/StyleUtil.luau | 270 +++++++++++++++ src/Theme/HCT/init.luau | 98 ++++++ src/Theme/Palette.story.luau | 57 ++++ src/Theme/Scheme.story.luau | 76 +++++ src/Theme/Scheme/init.luau | 31 +- src/Theme/Test.story.luau | 94 ------ src/Theme/init.luau | 393 +++++++++++----------- src/Types.luau | 116 +++++-- src/Typography.luau | 205 +++++++++++ src/Util.luau | 154 --------- src/init.luau | 9 +- 17 files changed, 1543 insertions(+), 668 deletions(-) create mode 100644 src/Style.luau create mode 100644 src/StyleUtil.luau create mode 100644 src/Theme/Palette.story.luau create mode 100644 src/Theme/Scheme.story.luau delete mode 100644 src/Theme/Test.story.luau create mode 100644 src/Typography.luau delete mode 100644 src/Util.luau diff --git a/pseudo-enum.toml b/pseudo-enum.toml index 0566437f..b0cddaa0 100644 --- a/pseudo-enum.toml +++ b/pseudo-enum.toml @@ -3,5 +3,60 @@ use_union_types_for_tree = false use_union_types_for_export = true [enums] +FontType = [ + "DisplayLarge", + "DisplayMedium", + "DisplaySmall", + "HeadlineLarge", + "HeadlineMedium", + "HeadlineSmall", + "TitleLarge", + "TitleMedium", + "TitleSmall", + "BodyLarge", + "BodyMedium", + "BodySmall", + "LabelLarge", + "LabelMedium", + "LabelSmall", +] ButtonStateType = ["Enabled", "Disabled", "Hovered", "Focused", "Pressed"] +SchemeType = ["Light", "Dark"] +ColorRoleType = [ + "Primary", + "Secondary", + "Tertiary", + "Error", + "Background", + "Surface", + "Outline", + "Shadow", + "Scrim" +] +ColorContextType = [ + "Default", + "On", + "Container", + "OnContainer", + "Surface", + "Dim", + "Bright", + "Lowest", + "Low", + "High", + "Highest", + "Tint", + "Variant", + "OnVariant", + "Inverse", + "InverseOn", +] +PaletteType = [ + "Primary", + "Secondary", + "Tertiary", + "Neutral", + "NeutralVariant", + "Error", +] \ No newline at end of file diff --git a/sourcemap.json b/sourcemap.json index 17ef67c6..fbf27771 100644 --- a/sourcemap.json +++ b/sourcemap.json @@ -1 +1 @@ -{"name":"synthetic-test","className":"DataModel","filePaths":["dev.project.json"],"children":[{"name":"ReplicatedStorage","className":"ReplicatedStorage","children":[{"name":"Packages","className":"Folder","children":[{"name":"ColdFusion","className":"ModuleScript","filePaths":["Packages\\ColdFusion.lua"]},{"name":"CurveUtil","className":"ModuleScript","filePaths":["Packages\\CurveUtil.lua"]},{"name":"Format","className":"ModuleScript","filePaths":["Packages\\Format.lua"]},{"name":"Fusion","className":"ModuleScript","filePaths":["Packages\\Fusion.lua"]},{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\Maid.lua"]},{"name":"MaterialIcons","className":"ModuleScript","filePaths":["Packages\\MaterialIcons.lua"]},{"name":"MeshUtil","className":"ModuleScript","filePaths":["Packages\\MeshUtil.lua"]},{"name":"Roact","className":"ModuleScript","filePaths":["Packages\\Roact.lua"]},{"name":"Signal","className":"ModuleScript","filePaths":["Packages\\Signal.lua"]},{"name":"TableUtil","className":"ModuleScript","filePaths":["Packages\\TableUtil.lua"]},{"name":"_Index","className":"Folder","children":[{"name":"elttob_fusion@0.2.0","className":"Folder","children":[{"name":"fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\init.lua","Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\default.project.json"],"children":[{"name":"Animation","className":"Folder","children":[{"name":"Spring","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\Spring.lua"]},{"name":"SpringScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\SpringScheduler.lua"]},{"name":"Tween","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\Tween.lua"]},{"name":"TweenScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\TweenScheduler.lua"]},{"name":"getTweenRatio","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\getTweenRatio.lua"]},{"name":"lerpType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\lerpType.lua"]},{"name":"packType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\packType.lua"]},{"name":"springCoefficients","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\springCoefficients.lua"]},{"name":"unpackType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\unpackType.lua"]}]},{"name":"Colour","className":"Folder","children":[{"name":"Oklab","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Colour\\Oklab.lua"]}]},{"name":"Dependencies","className":"Folder","children":[{"name":"captureDependencies","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\captureDependencies.lua"]},{"name":"initDependency","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\initDependency.lua"]},{"name":"sharedState","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\sharedState.lua"]},{"name":"updateAll","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\updateAll.lua"]},{"name":"useDependency","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\useDependency.lua"]}]},{"name":"Instances","className":"Folder","children":[{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Children.lua"]},{"name":"Cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Cleanup.lua"]},{"name":"Hydrate","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Hydrate.lua"]},{"name":"New","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\New.lua"]},{"name":"OnChange","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\OnChange.lua"]},{"name":"OnEvent","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\OnEvent.lua"]},{"name":"Out","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Out.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Ref.lua"]},{"name":"applyInstanceProps","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\applyInstanceProps.lua"]},{"name":"defaultProps","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\defaultProps.lua"]}]},{"name":"Logging","className":"Folder","children":[{"name":"logError","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logError.lua"]},{"name":"logErrorNonFatal","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logErrorNonFatal.lua"]},{"name":"logWarn","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logWarn.lua"]},{"name":"messages","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\messages.lua"]},{"name":"parseError","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\parseError.lua"]}]},{"name":"PubTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\PubTypes.lua"]},{"name":"State","className":"Folder","children":[{"name":"Computed","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Computed.lua"]},{"name":"ForKeys","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForKeys.lua"]},{"name":"ForPairs","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForPairs.lua"]},{"name":"ForValues","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForValues.lua"]},{"name":"Observer","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Observer.lua"]},{"name":"Value","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Value.lua"]},{"name":"unwrap","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\unwrap.lua"]}]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Types.lua"]},{"name":"Utility","className":"Folder","children":[{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\None.lua"]},{"name":"cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\cleanup.lua"]},{"name":"doNothing","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\doNothing.lua"]},{"name":"isSimilar","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\isSimilar.lua"]},{"name":"needsDestruction","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\needsDestruction.lua"]},{"name":"restrictRead","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\restrictRead.lua"]},{"name":"xtypeof","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\xtypeof.lua"]}]}]}]},{"name":"nightcycle_cold-fusion@9.0.7","className":"Folder","children":[{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\Maid.lua"]},{"name":"ServiceProxy","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\ServiceProxy.lua"]},{"name":"Signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\Signal.lua"]},{"name":"TableUtil","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\TableUtil.lua"]},{"name":"cold-fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\init.luau","Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\default.project.json"],"children":[{"name":"Fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\init.lua"],"children":[{"name":"Animation","className":"Folder","children":[{"name":"Spring","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\Spring.lua"]},{"name":"SpringScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\SpringScheduler.lua"]},{"name":"Tween","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\Tween.lua"]},{"name":"TweenScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\TweenScheduler.lua"]},{"name":"getTweenRatio","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\getTweenRatio.lua"]},{"name":"lerpType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\lerpType.lua"]},{"name":"packType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\packType.lua"]},{"name":"springCoefficients","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\springCoefficients.lua"]},{"name":"unpackType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\unpackType.lua"]}]},{"name":"Colour","className":"Folder","children":[{"name":"Oklab","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Colour\\Oklab.lua"]}]},{"name":"Instances","className":"Folder","children":[{"name":"Attribute","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Attribute.lua"]},{"name":"AttributeChange","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\AttributeChange.lua"]},{"name":"AttributeOut","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\AttributeOut.lua"]},{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Children.lua"]},{"name":"Cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Cleanup.lua"]},{"name":"Hydrate","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Hydrate.lua"]},{"name":"New","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\New.lua"]},{"name":"OnChange","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\OnChange.lua"]},{"name":"OnEvent","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\OnEvent.lua"]},{"name":"Out","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Out.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Ref.lua"]},{"name":"applyInstanceProps","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\applyInstanceProps.lua"]},{"name":"defaultProps","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\defaultProps.lua"]}]},{"name":"Logging","className":"Folder","children":[{"name":"logError","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logError.lua"]},{"name":"logErrorNonFatal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logErrorNonFatal.lua"]},{"name":"logWarn","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logWarn.lua"]},{"name":"messages","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\messages.lua"]},{"name":"parseError","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\parseError.lua"]}]},{"name":"PubTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\PubTypes.lua"]},{"name":"State","className":"Folder","children":[{"name":"Computed","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Computed.lua"]},{"name":"ForKeys","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForKeys.lua"]},{"name":"ForPairs","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForPairs.lua"]},{"name":"ForValues","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForValues.lua"]},{"name":"Observer","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Observer.lua"]},{"name":"Value","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Value.lua"]},{"name":"isState","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\isState.lua"]},{"name":"makeUseCallback","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\makeUseCallback.lua"]},{"name":"peek","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\peek.lua"]},{"name":"updateAll","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\updateAll.lua"]}]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Types.lua"]},{"name":"Utility","className":"Folder","children":[{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\None.lua"]},{"name":"cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\cleanup.lua"]},{"name":"doNothing","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\doNothing.lua"]},{"name":"isSimilar","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\isSimilar.lua"]},{"name":"needsDestruction","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\needsDestruction.lua"]},{"name":"restrictRead","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\restrictRead.lua"]},{"name":"xtypeof","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\xtypeof.lua"]}]}]},{"name":"InstanceTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\InstanceTypes.luau"]},{"name":"Interface","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Interface.luau"]},{"name":"Test.story","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Test.story.luau"]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Types.luau"]},{"name":"Util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Util.luau"]}]}]},{"name":"nightcycle_curve-util@1.0.0","className":"Folder","children":[{"name":"Vector","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\Vector.lua"]},{"name":"curve-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\init.lua","Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\default.project.json"],"children":[{"name":"Ease","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\Ease.lua"]},{"name":"Lerp","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\Lerp.lua"]}]}]},{"name":"nightcycle_format@0.1.3","className":"Folder","children":[{"name":"format","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\init.lua","Packages\\_Index\\nightcycle_format@0.1.3\\format\\default.project.json"],"children":[{"name":"Emoji","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\Emoji.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\init.spec.lua"]}]},{"name":"maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\maid.lua"]},{"name":"signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\signal.lua"]},{"name":"string","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\string.lua"]}]},{"name":"nightcycle_geometry-util@1.1.1","className":"Folder","children":[{"name":"geometry-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\init.lua","Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\default.project.json"],"children":[{"name":"Earcut","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\Earcut\\init.lua"],"children":[{"name":"ZeroArray","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\Earcut\\ZeroArray.lua"]}]}]}]},{"name":"nightcycle_maid@1.1.4","className":"Folder","children":[{"name":"maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\init.lua","Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\default.project.json"],"children":[{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\Maid.lua"]},{"name":"MaidTaskUtils","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\MaidTaskUtils.lua"]}]}]},{"name":"nightcycle_material-icons@1.0.1","className":"Folder","children":[{"name":"material-icons","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\init.luau","Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\default.project.json"],"children":[{"name":"Default_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_1.luau"]},{"name":"Default_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_2.luau"]},{"name":"Default_18_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_3.luau"]},{"name":"Default_18_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_4.luau"]},{"name":"Default_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_1.luau"]},{"name":"Default_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_2.luau"]},{"name":"Default_24_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_3.luau"]},{"name":"Default_24_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_4.luau"]},{"name":"Default_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_1.luau"]},{"name":"Default_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_2.luau"]},{"name":"Default_36_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_3.luau"]},{"name":"Default_36_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_4.luau"]},{"name":"Default_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_1.luau"]},{"name":"Default_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_2.luau"]},{"name":"Default_48_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_3.luau"]},{"name":"Default_48_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_4.luau"]},{"name":"Outlined_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_18_1.luau"]},{"name":"Outlined_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_18_2.luau"]},{"name":"Outlined_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_24_1.luau"]},{"name":"Outlined_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_24_2.luau"]},{"name":"Outlined_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_36_1.luau"]},{"name":"Outlined_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_36_2.luau"]},{"name":"Outlined_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_48_1.luau"]},{"name":"Outlined_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_48_2.luau"]},{"name":"Round_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_18_1.luau"]},{"name":"Round_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_18_2.luau"]},{"name":"Round_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_24_1.luau"]},{"name":"Round_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_24_2.luau"]},{"name":"Round_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_36_1.luau"]},{"name":"Round_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_36_2.luau"]},{"name":"Round_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_48_1.luau"]},{"name":"Round_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_48_2.luau"]},{"name":"Sharp_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_18_1.luau"]},{"name":"Sharp_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_18_2.luau"]},{"name":"Sharp_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_24_1.luau"]},{"name":"Sharp_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_24_2.luau"]},{"name":"Sharp_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_36_1.luau"]},{"name":"Sharp_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_36_2.luau"]},{"name":"Sharp_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_48_1.luau"]},{"name":"Sharp_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_48_2.luau"]},{"name":"TwoTone_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_18_1.luau"]},{"name":"TwoTone_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_18_2.luau"]},{"name":"TwoTone_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_24_1.luau"]},{"name":"TwoTone_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_24_2.luau"]},{"name":"TwoTone_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_36_1.luau"]},{"name":"TwoTone_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_36_2.luau"]},{"name":"TwoTone_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_48_1.luau"]},{"name":"TwoTone_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_48_2.luau"]}]}]},{"name":"nightcycle_mesh-util@1.0.3","className":"Folder","children":[{"name":"GeometryUtil","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\GeometryUtil.lua"]},{"name":"mesh-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\init.lua","Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\default.project.json"],"children":[{"name":"CornerWedgePart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\CornerWedgePart.lua"]},{"name":"Part","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\Part.lua"]},{"name":"TetraPart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\TetraPart.lua"]},{"name":"WedgePart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\WedgePart.lua"]}]}]},{"name":"nightcycle_service-proxy@1.0.0","className":"Folder","children":[{"name":"service-proxy","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_service-proxy@1.0.0\\service-proxy\\src\\init.lua","Packages\\_Index\\nightcycle_service-proxy@1.0.0\\service-proxy\\default.project.json"]}]},{"name":"nightcycle_signal@1.0.2","className":"Folder","children":[{"name":"signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_signal@1.0.2\\signal\\src\\init.lua","Packages\\_Index\\nightcycle_signal@1.0.2\\signal\\default.project.json"]}]},{"name":"nightcycle_string@0.1.0","className":"Folder","children":[{"name":"string","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_string@0.1.0\\string\\src\\init.lua","Packages\\_Index\\nightcycle_string@0.1.0\\string\\default.project.json"],"children":[{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_string@0.1.0\\string\\src\\init.spec.lua"]}]}]},{"name":"nightcycle_table-util@1.1.0","className":"Folder","children":[{"name":"table-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_table-util@1.1.0\\table-util\\src\\init.lua","Packages\\_Index\\nightcycle_table-util@1.1.0\\table-util\\default.project.json"]}]},{"name":"nightcycle_vector@1.0.2","className":"Folder","children":[{"name":"vector","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_vector@1.0.2\\vector\\src\\init.lua","Packages\\_Index\\nightcycle_vector@1.0.2\\vector\\default.project.json"]}]},{"name":"roblox_roact@1.4.4","className":"Folder","children":[{"name":"roact","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\init.lua","Packages\\_Index\\roblox_roact@1.4.4\\roact\\default.project.json"],"children":[{"name":"Binding","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Binding.lua"]},{"name":"Binding.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Binding.spec.lua"]},{"name":"Component","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.lua"]},{"name":"Component.spec","className":"Folder","children":[{"name":"context.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\context.spec.lua"]},{"name":"defaultProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\defaultProps.spec.lua"]},{"name":"didMount.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\didMount.spec.lua"]},{"name":"didUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\didUpdate.spec.lua"]},{"name":"extend.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\extend.spec.lua"]},{"name":"getDerivedStateFromProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\getDerivedStateFromProps.spec.lua"]},{"name":"getElementTraceback.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\getElementTraceback.spec.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\init.spec.lua"]},{"name":"legacyContext.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\legacyContext.spec.lua"]},{"name":"render.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\render.spec.lua"]},{"name":"setState.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\setState.spec.lua"]},{"name":"shouldUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\shouldUpdate.spec.lua"]},{"name":"validateProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\validateProps.spec.lua"]},{"name":"willUnmount.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\willUnmount.spec.lua"]},{"name":"willUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\willUpdate.spec.lua"]}]},{"name":"ComponentLifecyclePhase","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ComponentLifecyclePhase.lua"]},{"name":"Config","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Config.lua"]},{"name":"Config.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Config.spec.lua"]},{"name":"ElementKind","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementKind.lua"]},{"name":"ElementKind.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementKind.spec.lua"]},{"name":"ElementUtils","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementUtils.lua"]},{"name":"ElementUtils.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementUtils.spec.lua"]},{"name":"GlobalConfig","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\GlobalConfig.lua"]},{"name":"GlobalConfig.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\GlobalConfig.spec.lua"]},{"name":"Logging","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Logging.lua"]},{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\None.lua"]},{"name":"NoopRenderer","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\NoopRenderer.lua"]},{"name":"Portal","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Portal.lua"]},{"name":"PropMarkers","className":"Folder","children":[{"name":"Change","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Change.lua"]},{"name":"Change.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Change.spec.lua"]},{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Children.lua"]},{"name":"Event","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Event.lua"]},{"name":"Event.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Event.spec.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Ref.lua"]}]},{"name":"PureComponent","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PureComponent.lua"]},{"name":"PureComponent.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PureComponent.spec.lua"]},{"name":"RobloxRenderer","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\RobloxRenderer.lua"]},{"name":"RobloxRenderer.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\RobloxRenderer.spec.lua"]},{"name":"SingleEventManager","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\SingleEventManager.lua"]},{"name":"SingleEventManager.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\SingleEventManager.spec.lua"]},{"name":"Symbol","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Symbol.lua"]},{"name":"Symbol.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Symbol.spec.lua"]},{"name":"Type","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Type.lua"]},{"name":"Type.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Type.spec.lua"]},{"name":"assertDeepEqual","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assertDeepEqual.lua"]},{"name":"assertDeepEqual.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assertDeepEqual.spec.lua"]},{"name":"assign","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assign.lua"]},{"name":"assign.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assign.spec.lua"]},{"name":"createContext","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createContext.lua"]},{"name":"createContext.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createContext.spec.lua"]},{"name":"createElement","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createElement.lua"]},{"name":"createElement.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createElement.spec.lua"]},{"name":"createFragment","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createFragment.lua"]},{"name":"createFragment.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createFragment.spec.lua"]},{"name":"createReconciler","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconciler.lua"]},{"name":"createReconciler.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconciler.spec.lua"]},{"name":"createReconcilerCompat","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconcilerCompat.lua"]},{"name":"createReconcilerCompat.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconcilerCompat.spec.lua"]},{"name":"createRef","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createRef.lua"]},{"name":"createRef.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createRef.spec.lua"]},{"name":"createSignal","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSignal.lua"]},{"name":"createSignal.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSignal.spec.lua"]},{"name":"createSpy","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSpy.lua"]},{"name":"createSpy.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSpy.spec.lua"]},{"name":"forwardRef","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\forwardRef.lua"]},{"name":"forwardRef.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\forwardRef.spec.lua"]},{"name":"getDefaultInstanceProperty","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\getDefaultInstanceProperty.lua"]},{"name":"getDefaultInstanceProperty.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\getDefaultInstanceProperty.spec.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\init.spec.lua"]},{"name":"internalAssert","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\internalAssert.lua"]},{"name":"invalidSetStateMessages","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\invalidSetStateMessages.lua"]},{"name":"oneChild","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\oneChild.lua"]},{"name":"oneChild.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\oneChild.spec.lua"]},{"name":"strict","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\strict.lua"]},{"name":"strict.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\strict.spec.lua"]}]}]}]},{"name":"synthetic","className":"ModuleScript","filePaths":["src\\init.luau"],"children":[{"name":"Component","className":"Folder","children":[{"name":"Bar","className":"Folder","children":[{"name":"Bottom","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Bottom\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Bottom\\cfusion.story.luau"]}]},{"name":"Top","className":"Folder","children":[{"name":"Base","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Base.luau"]},{"name":"Center","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Center\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Center\\cfusion.story.luau"]}]},{"name":"Large","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Large\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Large\\cfusion.story.luau"]}]},{"name":"Medium","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Medium\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Medium\\cfusion.story.luau"]}]},{"name":"Small","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Small\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Small\\cfusion.story.luau"]}]}]}]},{"name":"Button","className":"Folder","children":[{"name":"Badge","className":"ModuleScript","filePaths":["src\\Component\\Button\\Badge\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\Badge\\cfusion.story.luau"]}]},{"name":"Base","className":"ModuleScript","filePaths":["src\\Component\\Button\\Base.luau"]},{"name":"ElevatedButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\ElevatedButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\ElevatedButton\\cfusion.story.luau"]}]},{"name":"ExtendedFAB","className":"ModuleScript","filePaths":["src\\Component\\Button\\ExtendedFAB\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\ExtendedFAB\\cfusion.story.luau"]}]},{"name":"FAB","className":"ModuleScript","filePaths":["src\\Component\\Button\\FAB\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\FAB\\cfusion.story.luau"]}]},{"name":"FilledButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledButton\\cfusion.story.luau"]}]},{"name":"FilledIconButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledIconButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledIconButton\\cfusion.story.luau"]}]},{"name":"IconButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\IconButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\IconButton\\cfusion.story.luau"]}]},{"name":"OutlinedButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedButton\\cfusion.story.luau"]}]},{"name":"OutlinedIconButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedIconButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedIconButton\\cfusion.story.luau"]}]},{"name":"Segmented","className":"ModuleScript","filePaths":["src\\Component\\Button\\Segmented\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\Segmented\\cfusion.story.luau"]}]},{"name":"TextButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\TextButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\TextButton\\cfusion.story.luau"]}]}]}]},{"name":"Config","className":"ModuleScript","filePaths":["src\\Config.luau"]},{"name":"Enums","className":"ModuleScript","filePaths":["src\\Enums.luau"]},{"name":"Sounds","className":"ModuleScript","filePaths":["src\\Sounds.luau"]},{"name":"Test","className":"Folder","children":[{"name":"Source.cfusion","className":"ModuleScript","filePaths":["src\\Test\\Source.cfusion.luau"]}]},{"name":"Theme","className":"ModuleScript","filePaths":["src\\Theme\\init.luau"],"children":[{"name":"Blend","className":"ModuleScript","filePaths":["src\\Theme\\Blend.luau"]},{"name":"ColorUtil","className":"ModuleScript","filePaths":["src\\Theme\\ColorUtil.luau"]},{"name":"HCT","className":"ModuleScript","filePaths":["src\\Theme\\HCT\\init.luau"],"children":[{"name":"Cam16","className":"ModuleScript","filePaths":["src\\Theme\\HCT\\Cam16.luau"]},{"name":"Solver","className":"ModuleScript","filePaths":["src\\Theme\\HCT\\Solver.luau"]}]},{"name":"MathUtil","className":"ModuleScript","filePaths":["src\\Theme\\MathUtil.luau"]},{"name":"Palettes","className":"Folder","children":[{"name":"Core","className":"ModuleScript","filePaths":["src\\Theme\\Palettes\\Core.luau"]},{"name":"Tonal","className":"ModuleScript","filePaths":["src\\Theme\\Palettes\\Tonal.luau"]}]},{"name":"Scheme","className":"ModuleScript","filePaths":["src\\Theme\\Scheme\\init.luau"]},{"name":"Test.story","className":"ModuleScript","filePaths":["src\\Theme\\Test.story.luau"]},{"name":"ThemeUtil","className":"ModuleScript","filePaths":["src\\Theme\\ThemeUtil.luau"]},{"name":"ViewingConditions","className":"ModuleScript","filePaths":["src\\Theme\\ViewingConditions.luau"]}]},{"name":"Types","className":"ModuleScript","filePaths":["src\\Types.luau"]},{"name":"Util","className":"ModuleScript","filePaths":["src\\Util.luau"]}]}]}]}]} \ No newline at end of file +{"name":"synthetic-test","className":"DataModel","filePaths":["dev.project.json"],"children":[{"name":"ReplicatedStorage","className":"ReplicatedStorage","children":[{"name":"Packages","className":"Folder","children":[{"name":"ColdFusion","className":"ModuleScript","filePaths":["Packages\\ColdFusion.lua"]},{"name":"CurveUtil","className":"ModuleScript","filePaths":["Packages\\CurveUtil.lua"]},{"name":"Format","className":"ModuleScript","filePaths":["Packages\\Format.lua"]},{"name":"Fusion","className":"ModuleScript","filePaths":["Packages\\Fusion.lua"]},{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\Maid.lua"]},{"name":"MaterialIcons","className":"ModuleScript","filePaths":["Packages\\MaterialIcons.lua"]},{"name":"MeshUtil","className":"ModuleScript","filePaths":["Packages\\MeshUtil.lua"]},{"name":"Roact","className":"ModuleScript","filePaths":["Packages\\Roact.lua"]},{"name":"Signal","className":"ModuleScript","filePaths":["Packages\\Signal.lua"]},{"name":"TableUtil","className":"ModuleScript","filePaths":["Packages\\TableUtil.lua"]},{"name":"_Index","className":"Folder","children":[{"name":"elttob_fusion@0.2.0","className":"Folder","children":[{"name":"fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\init.lua","Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\default.project.json"],"children":[{"name":"Animation","className":"Folder","children":[{"name":"Spring","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\Spring.lua"]},{"name":"SpringScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\SpringScheduler.lua"]},{"name":"Tween","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\Tween.lua"]},{"name":"TweenScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\TweenScheduler.lua"]},{"name":"getTweenRatio","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\getTweenRatio.lua"]},{"name":"lerpType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\lerpType.lua"]},{"name":"packType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\packType.lua"]},{"name":"springCoefficients","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\springCoefficients.lua"]},{"name":"unpackType","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Animation\\unpackType.lua"]}]},{"name":"Colour","className":"Folder","children":[{"name":"Oklab","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Colour\\Oklab.lua"]}]},{"name":"Dependencies","className":"Folder","children":[{"name":"captureDependencies","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\captureDependencies.lua"]},{"name":"initDependency","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\initDependency.lua"]},{"name":"sharedState","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\sharedState.lua"]},{"name":"updateAll","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\updateAll.lua"]},{"name":"useDependency","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Dependencies\\useDependency.lua"]}]},{"name":"Instances","className":"Folder","children":[{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Children.lua"]},{"name":"Cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Cleanup.lua"]},{"name":"Hydrate","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Hydrate.lua"]},{"name":"New","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\New.lua"]},{"name":"OnChange","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\OnChange.lua"]},{"name":"OnEvent","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\OnEvent.lua"]},{"name":"Out","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Out.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\Ref.lua"]},{"name":"applyInstanceProps","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\applyInstanceProps.lua"]},{"name":"defaultProps","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Instances\\defaultProps.lua"]}]},{"name":"Logging","className":"Folder","children":[{"name":"logError","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logError.lua"]},{"name":"logErrorNonFatal","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logErrorNonFatal.lua"]},{"name":"logWarn","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\logWarn.lua"]},{"name":"messages","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\messages.lua"]},{"name":"parseError","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Logging\\parseError.lua"]}]},{"name":"PubTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\PubTypes.lua"]},{"name":"State","className":"Folder","children":[{"name":"Computed","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Computed.lua"]},{"name":"ForKeys","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForKeys.lua"]},{"name":"ForPairs","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForPairs.lua"]},{"name":"ForValues","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\ForValues.lua"]},{"name":"Observer","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Observer.lua"]},{"name":"Value","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\Value.lua"]},{"name":"unwrap","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\State\\unwrap.lua"]}]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Types.lua"]},{"name":"Utility","className":"Folder","children":[{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\None.lua"]},{"name":"cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\cleanup.lua"]},{"name":"doNothing","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\doNothing.lua"]},{"name":"isSimilar","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\isSimilar.lua"]},{"name":"needsDestruction","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\needsDestruction.lua"]},{"name":"restrictRead","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\restrictRead.lua"]},{"name":"xtypeof","className":"ModuleScript","filePaths":["Packages\\_Index\\elttob_fusion@0.2.0\\fusion\\src\\Utility\\xtypeof.lua"]}]}]}]},{"name":"nightcycle_cold-fusion@9.0.7","className":"Folder","children":[{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\Maid.lua"]},{"name":"ServiceProxy","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\ServiceProxy.lua"]},{"name":"Signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\Signal.lua"]},{"name":"TableUtil","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\TableUtil.lua"]},{"name":"cold-fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\init.luau","Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\default.project.json"],"children":[{"name":"Fusion","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\init.lua"],"children":[{"name":"Animation","className":"Folder","children":[{"name":"Spring","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\Spring.lua"]},{"name":"SpringScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\SpringScheduler.lua"]},{"name":"Tween","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\Tween.lua"]},{"name":"TweenScheduler","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\TweenScheduler.lua"]},{"name":"getTweenRatio","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\getTweenRatio.lua"]},{"name":"lerpType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\lerpType.lua"]},{"name":"packType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\packType.lua"]},{"name":"springCoefficients","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\springCoefficients.lua"]},{"name":"unpackType","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Animation\\unpackType.lua"]}]},{"name":"Colour","className":"Folder","children":[{"name":"Oklab","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Colour\\Oklab.lua"]}]},{"name":"Instances","className":"Folder","children":[{"name":"Attribute","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Attribute.lua"]},{"name":"AttributeChange","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\AttributeChange.lua"]},{"name":"AttributeOut","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\AttributeOut.lua"]},{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Children.lua"]},{"name":"Cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Cleanup.lua"]},{"name":"Hydrate","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Hydrate.lua"]},{"name":"New","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\New.lua"]},{"name":"OnChange","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\OnChange.lua"]},{"name":"OnEvent","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\OnEvent.lua"]},{"name":"Out","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Out.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\Ref.lua"]},{"name":"applyInstanceProps","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\applyInstanceProps.lua"]},{"name":"defaultProps","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Instances\\defaultProps.lua"]}]},{"name":"Logging","className":"Folder","children":[{"name":"logError","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logError.lua"]},{"name":"logErrorNonFatal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logErrorNonFatal.lua"]},{"name":"logWarn","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\logWarn.lua"]},{"name":"messages","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\messages.lua"]},{"name":"parseError","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Logging\\parseError.lua"]}]},{"name":"PubTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\PubTypes.lua"]},{"name":"State","className":"Folder","children":[{"name":"Computed","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Computed.lua"]},{"name":"ForKeys","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForKeys.lua"]},{"name":"ForPairs","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForPairs.lua"]},{"name":"ForValues","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\ForValues.lua"]},{"name":"Observer","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Observer.lua"]},{"name":"Value","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\Value.lua"]},{"name":"isState","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\isState.lua"]},{"name":"makeUseCallback","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\makeUseCallback.lua"]},{"name":"peek","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\peek.lua"]},{"name":"updateAll","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\State\\updateAll.lua"]}]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Types.lua"]},{"name":"Utility","className":"Folder","children":[{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\None.lua"]},{"name":"cleanup","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\cleanup.lua"]},{"name":"doNothing","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\doNothing.lua"]},{"name":"isSimilar","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\isSimilar.lua"]},{"name":"needsDestruction","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\needsDestruction.lua"]},{"name":"restrictRead","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\restrictRead.lua"]},{"name":"xtypeof","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Fusion\\Utility\\xtypeof.lua"]}]}]},{"name":"InstanceTypes","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\InstanceTypes.luau"]},{"name":"Interface","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Interface.luau"]},{"name":"Test.story","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Test.story.luau"]},{"name":"Types","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Types.luau"]},{"name":"Util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_cold-fusion@9.0.7\\cold-fusion\\src\\Util.luau"]}]}]},{"name":"nightcycle_curve-util@1.0.0","className":"Folder","children":[{"name":"Vector","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\Vector.lua"]},{"name":"curve-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\init.lua","Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\default.project.json"],"children":[{"name":"Ease","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\Ease.lua"]},{"name":"Lerp","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_curve-util@1.0.0\\curve-util\\src\\Lerp.lua"]}]}]},{"name":"nightcycle_format@0.1.3","className":"Folder","children":[{"name":"format","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\init.lua","Packages\\_Index\\nightcycle_format@0.1.3\\format\\default.project.json"],"children":[{"name":"Emoji","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\Emoji.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\format\\src\\init.spec.lua"]}]},{"name":"maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\maid.lua"]},{"name":"signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\signal.lua"]},{"name":"string","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_format@0.1.3\\string.lua"]}]},{"name":"nightcycle_geometry-util@1.1.1","className":"Folder","children":[{"name":"geometry-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\init.lua","Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\default.project.json"],"children":[{"name":"Earcut","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\Earcut\\init.lua"],"children":[{"name":"ZeroArray","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_geometry-util@1.1.1\\geometry-util\\src\\Earcut\\ZeroArray.lua"]}]}]}]},{"name":"nightcycle_maid@1.1.4","className":"Folder","children":[{"name":"maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\init.lua","Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\default.project.json"],"children":[{"name":"Maid","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\Maid.lua"]},{"name":"MaidTaskUtils","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_maid@1.1.4\\maid\\src\\MaidTaskUtils.lua"]}]}]},{"name":"nightcycle_material-icons@1.0.1","className":"Folder","children":[{"name":"material-icons","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\init.luau","Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\default.project.json"],"children":[{"name":"Default_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_1.luau"]},{"name":"Default_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_2.luau"]},{"name":"Default_18_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_3.luau"]},{"name":"Default_18_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_18_4.luau"]},{"name":"Default_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_1.luau"]},{"name":"Default_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_2.luau"]},{"name":"Default_24_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_3.luau"]},{"name":"Default_24_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_24_4.luau"]},{"name":"Default_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_1.luau"]},{"name":"Default_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_2.luau"]},{"name":"Default_36_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_3.luau"]},{"name":"Default_36_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_36_4.luau"]},{"name":"Default_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_1.luau"]},{"name":"Default_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_2.luau"]},{"name":"Default_48_3","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_3.luau"]},{"name":"Default_48_4","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Default_48_4.luau"]},{"name":"Outlined_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_18_1.luau"]},{"name":"Outlined_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_18_2.luau"]},{"name":"Outlined_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_24_1.luau"]},{"name":"Outlined_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_24_2.luau"]},{"name":"Outlined_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_36_1.luau"]},{"name":"Outlined_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_36_2.luau"]},{"name":"Outlined_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_48_1.luau"]},{"name":"Outlined_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Outlined_48_2.luau"]},{"name":"Round_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_18_1.luau"]},{"name":"Round_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_18_2.luau"]},{"name":"Round_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_24_1.luau"]},{"name":"Round_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_24_2.luau"]},{"name":"Round_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_36_1.luau"]},{"name":"Round_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_36_2.luau"]},{"name":"Round_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_48_1.luau"]},{"name":"Round_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Round_48_2.luau"]},{"name":"Sharp_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_18_1.luau"]},{"name":"Sharp_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_18_2.luau"]},{"name":"Sharp_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_24_1.luau"]},{"name":"Sharp_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_24_2.luau"]},{"name":"Sharp_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_36_1.luau"]},{"name":"Sharp_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_36_2.luau"]},{"name":"Sharp_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_48_1.luau"]},{"name":"Sharp_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\Sharp_48_2.luau"]},{"name":"TwoTone_18_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_18_1.luau"]},{"name":"TwoTone_18_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_18_2.luau"]},{"name":"TwoTone_24_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_24_1.luau"]},{"name":"TwoTone_24_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_24_2.luau"]},{"name":"TwoTone_36_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_36_1.luau"]},{"name":"TwoTone_36_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_36_2.luau"]},{"name":"TwoTone_48_1","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_48_1.luau"]},{"name":"TwoTone_48_2","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_material-icons@1.0.1\\material-icons\\src\\TwoTone_48_2.luau"]}]}]},{"name":"nightcycle_mesh-util@1.0.3","className":"Folder","children":[{"name":"GeometryUtil","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\GeometryUtil.lua"]},{"name":"mesh-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\init.lua","Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\default.project.json"],"children":[{"name":"CornerWedgePart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\CornerWedgePart.lua"]},{"name":"Part","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\Part.lua"]},{"name":"TetraPart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\TetraPart.lua"]},{"name":"WedgePart","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_mesh-util@1.0.3\\mesh-util\\src\\WedgePart.lua"]}]}]},{"name":"nightcycle_service-proxy@1.0.0","className":"Folder","children":[{"name":"service-proxy","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_service-proxy@1.0.0\\service-proxy\\src\\init.lua","Packages\\_Index\\nightcycle_service-proxy@1.0.0\\service-proxy\\default.project.json"]}]},{"name":"nightcycle_signal@1.0.2","className":"Folder","children":[{"name":"signal","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_signal@1.0.2\\signal\\src\\init.lua","Packages\\_Index\\nightcycle_signal@1.0.2\\signal\\default.project.json"]}]},{"name":"nightcycle_string@0.1.0","className":"Folder","children":[{"name":"string","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_string@0.1.0\\string\\src\\init.lua","Packages\\_Index\\nightcycle_string@0.1.0\\string\\default.project.json"],"children":[{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_string@0.1.0\\string\\src\\init.spec.lua"]}]}]},{"name":"nightcycle_table-util@1.1.0","className":"Folder","children":[{"name":"table-util","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_table-util@1.1.0\\table-util\\src\\init.lua","Packages\\_Index\\nightcycle_table-util@1.1.0\\table-util\\default.project.json"]}]},{"name":"nightcycle_vector@1.0.2","className":"Folder","children":[{"name":"vector","className":"ModuleScript","filePaths":["Packages\\_Index\\nightcycle_vector@1.0.2\\vector\\src\\init.lua","Packages\\_Index\\nightcycle_vector@1.0.2\\vector\\default.project.json"]}]},{"name":"roblox_roact@1.4.4","className":"Folder","children":[{"name":"roact","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\init.lua","Packages\\_Index\\roblox_roact@1.4.4\\roact\\default.project.json"],"children":[{"name":"Binding","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Binding.lua"]},{"name":"Binding.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Binding.spec.lua"]},{"name":"Component","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.lua"]},{"name":"Component.spec","className":"Folder","children":[{"name":"context.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\context.spec.lua"]},{"name":"defaultProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\defaultProps.spec.lua"]},{"name":"didMount.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\didMount.spec.lua"]},{"name":"didUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\didUpdate.spec.lua"]},{"name":"extend.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\extend.spec.lua"]},{"name":"getDerivedStateFromProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\getDerivedStateFromProps.spec.lua"]},{"name":"getElementTraceback.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\getElementTraceback.spec.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\init.spec.lua"]},{"name":"legacyContext.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\legacyContext.spec.lua"]},{"name":"render.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\render.spec.lua"]},{"name":"setState.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\setState.spec.lua"]},{"name":"shouldUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\shouldUpdate.spec.lua"]},{"name":"validateProps.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\validateProps.spec.lua"]},{"name":"willUnmount.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\willUnmount.spec.lua"]},{"name":"willUpdate.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Component.spec\\willUpdate.spec.lua"]}]},{"name":"ComponentLifecyclePhase","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ComponentLifecyclePhase.lua"]},{"name":"Config","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Config.lua"]},{"name":"Config.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Config.spec.lua"]},{"name":"ElementKind","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementKind.lua"]},{"name":"ElementKind.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementKind.spec.lua"]},{"name":"ElementUtils","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementUtils.lua"]},{"name":"ElementUtils.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\ElementUtils.spec.lua"]},{"name":"GlobalConfig","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\GlobalConfig.lua"]},{"name":"GlobalConfig.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\GlobalConfig.spec.lua"]},{"name":"Logging","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Logging.lua"]},{"name":"None","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\None.lua"]},{"name":"NoopRenderer","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\NoopRenderer.lua"]},{"name":"Portal","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Portal.lua"]},{"name":"PropMarkers","className":"Folder","children":[{"name":"Change","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Change.lua"]},{"name":"Change.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Change.spec.lua"]},{"name":"Children","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Children.lua"]},{"name":"Event","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Event.lua"]},{"name":"Event.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Event.spec.lua"]},{"name":"Ref","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PropMarkers\\Ref.lua"]}]},{"name":"PureComponent","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PureComponent.lua"]},{"name":"PureComponent.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\PureComponent.spec.lua"]},{"name":"RobloxRenderer","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\RobloxRenderer.lua"]},{"name":"RobloxRenderer.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\RobloxRenderer.spec.lua"]},{"name":"SingleEventManager","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\SingleEventManager.lua"]},{"name":"SingleEventManager.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\SingleEventManager.spec.lua"]},{"name":"Symbol","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Symbol.lua"]},{"name":"Symbol.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Symbol.spec.lua"]},{"name":"Type","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Type.lua"]},{"name":"Type.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\Type.spec.lua"]},{"name":"assertDeepEqual","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assertDeepEqual.lua"]},{"name":"assertDeepEqual.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assertDeepEqual.spec.lua"]},{"name":"assign","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assign.lua"]},{"name":"assign.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\assign.spec.lua"]},{"name":"createContext","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createContext.lua"]},{"name":"createContext.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createContext.spec.lua"]},{"name":"createElement","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createElement.lua"]},{"name":"createElement.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createElement.spec.lua"]},{"name":"createFragment","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createFragment.lua"]},{"name":"createFragment.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createFragment.spec.lua"]},{"name":"createReconciler","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconciler.lua"]},{"name":"createReconciler.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconciler.spec.lua"]},{"name":"createReconcilerCompat","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconcilerCompat.lua"]},{"name":"createReconcilerCompat.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createReconcilerCompat.spec.lua"]},{"name":"createRef","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createRef.lua"]},{"name":"createRef.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createRef.spec.lua"]},{"name":"createSignal","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSignal.lua"]},{"name":"createSignal.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSignal.spec.lua"]},{"name":"createSpy","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSpy.lua"]},{"name":"createSpy.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\createSpy.spec.lua"]},{"name":"forwardRef","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\forwardRef.lua"]},{"name":"forwardRef.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\forwardRef.spec.lua"]},{"name":"getDefaultInstanceProperty","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\getDefaultInstanceProperty.lua"]},{"name":"getDefaultInstanceProperty.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\getDefaultInstanceProperty.spec.lua"]},{"name":"init.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\init.spec.lua"]},{"name":"internalAssert","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\internalAssert.lua"]},{"name":"invalidSetStateMessages","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\invalidSetStateMessages.lua"]},{"name":"oneChild","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\oneChild.lua"]},{"name":"oneChild.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\oneChild.spec.lua"]},{"name":"strict","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\strict.lua"]},{"name":"strict.spec","className":"ModuleScript","filePaths":["Packages\\_Index\\roblox_roact@1.4.4\\roact\\src\\strict.spec.lua"]}]}]}]},{"name":"synthetic","className":"ModuleScript","filePaths":["src\\init.luau"],"children":[{"name":"Component","className":"Folder","children":[{"name":"Bar","className":"Folder","children":[{"name":"Bottom","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Bottom\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Bottom\\cfusion.story.luau"]}]},{"name":"Top","className":"Folder","children":[{"name":"Base","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Base.luau"]},{"name":"Center","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Center\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Center\\cfusion.story.luau"]}]},{"name":"Large","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Large\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Large\\cfusion.story.luau"]}]},{"name":"Medium","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Medium\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Medium\\cfusion.story.luau"]}]},{"name":"Small","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Small\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Bar\\Top\\Small\\cfusion.story.luau"]}]}]}]},{"name":"Button","className":"Folder","children":[{"name":"Badge","className":"ModuleScript","filePaths":["src\\Component\\Button\\Badge\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\Badge\\cfusion.story.luau"]}]},{"name":"Base","className":"ModuleScript","filePaths":["src\\Component\\Button\\Base.luau"]},{"name":"ElevatedButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\ElevatedButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\ElevatedButton\\cfusion.story.luau"]}]},{"name":"ExtendedFAB","className":"ModuleScript","filePaths":["src\\Component\\Button\\ExtendedFAB\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\ExtendedFAB\\cfusion.story.luau"]}]},{"name":"FAB","className":"ModuleScript","filePaths":["src\\Component\\Button\\FAB\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\FAB\\cfusion.story.luau"]}]},{"name":"FilledButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledButton\\cfusion.story.luau"]}]},{"name":"FilledIconButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledIconButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\FilledIconButton\\cfusion.story.luau"]}]},{"name":"IconButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\IconButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\IconButton\\cfusion.story.luau"]}]},{"name":"OutlinedButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedButton\\cfusion.story.luau"]}]},{"name":"OutlinedIconButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedIconButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\OutlinedIconButton\\cfusion.story.luau"]}]},{"name":"Segmented","className":"ModuleScript","filePaths":["src\\Component\\Button\\Segmented\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\Segmented\\cfusion.story.luau"]}]},{"name":"TextButton","className":"ModuleScript","filePaths":["src\\Component\\Button\\TextButton\\init.luau"],"children":[{"name":"cfusion.story","className":"ModuleScript","filePaths":["src\\Component\\Button\\TextButton\\cfusion.story.luau"]}]}]}]},{"name":"Config","className":"ModuleScript","filePaths":["src\\Config.luau"]},{"name":"Enums","className":"ModuleScript","filePaths":["src\\Enums.luau"]},{"name":"Sounds","className":"ModuleScript","filePaths":["src\\Sounds.luau"]},{"name":"Style","className":"ModuleScript","filePaths":["src\\Style.luau"]},{"name":"StyleUtil","className":"ModuleScript","filePaths":["src\\StyleUtil.luau"]},{"name":"Test","className":"Folder","children":[{"name":"Source.cfusion","className":"ModuleScript","filePaths":["src\\Test\\Source.cfusion.luau"]}]},{"name":"Theme","className":"ModuleScript","filePaths":["src\\Theme\\init.luau"],"children":[{"name":"Blend","className":"ModuleScript","filePaths":["src\\Theme\\Blend.luau"]},{"name":"ColorUtil","className":"ModuleScript","filePaths":["src\\Theme\\ColorUtil.luau"]},{"name":"HCT","className":"ModuleScript","filePaths":["src\\Theme\\HCT\\init.luau"],"children":[{"name":"Cam16","className":"ModuleScript","filePaths":["src\\Theme\\HCT\\Cam16.luau"]},{"name":"Solver","className":"ModuleScript","filePaths":["src\\Theme\\HCT\\Solver.luau"]}]},{"name":"MathUtil","className":"ModuleScript","filePaths":["src\\Theme\\MathUtil.luau"]},{"name":"Palette.story","className":"ModuleScript","filePaths":["src\\Theme\\Palette.story.luau"]},{"name":"Palettes","className":"Folder","children":[{"name":"Core","className":"ModuleScript","filePaths":["src\\Theme\\Palettes\\Core.luau"]},{"name":"Tonal","className":"ModuleScript","filePaths":["src\\Theme\\Palettes\\Tonal.luau"]}]},{"name":"Scheme","className":"ModuleScript","filePaths":["src\\Theme\\Scheme\\init.luau"]},{"name":"Scheme.story","className":"ModuleScript","filePaths":["src\\Theme\\Scheme.story.luau"]},{"name":"ThemeUtil","className":"ModuleScript","filePaths":["src\\Theme\\ThemeUtil.luau"]},{"name":"ViewingConditions","className":"ModuleScript","filePaths":["src\\Theme\\ViewingConditions.luau"]}]},{"name":"Types","className":"ModuleScript","filePaths":["src\\Types.luau"]},{"name":"Typography","className":"ModuleScript","filePaths":["src\\Typography.luau"]}]}]}]}]} \ No newline at end of file diff --git a/src/Component/Button/Base.luau b/src/Component/Button/Base.luau index c807870a..eca85c1c 100644 --- a/src/Component/Button/Base.luau +++ b/src/Component/Button/Base.luau @@ -13,14 +13,18 @@ local CurveUtil = require(_Packages:WaitForChild("CurveUtil")) -- Modules local Enums = require(_Package:WaitForChild("Enums")) local Types = require(_Package:WaitForChild("Types")) - +local Theme = require(_Package:WaitForChild("Theme")) +local StyleUtil = require(_Package:WaitForChild("StyleUtil")) -- Types type Maid = Maid.Maid +type Fuse = ColdFusion.Fuse type State = ColdFusion.State type ValueState = ColdFusion.ValueState type CanBeState = ColdFusion.CanBeState type ImageData = Types.ImageData -type Style = Types.Style +type RenderData = Types.RenderData +type FontData = Types.FontData +type AppearanceData = Types.AppearanceData -- Constants local HEIGHT_DP = 40 local SHAPE_DP = 20 @@ -34,29 +38,33 @@ local LABEL_TEXT_ALIGNMENT = Enum.TextXAlignment.Center local IMAGE_SIZE = 500 local RIP_STEP = 0.005 local HALF_IMAGE_SIZE = IMAGE_SIZE / 2 -return function( + +local sAssert = StyleUtil.assert +local isNil = StyleUtil.isNil +local flip = StyleUtil.inverse + +local Util = {} + +Util.component = function( maid: Maid, onClick: CanBeState<() -> ()>, text: CanBeState, - font: CanBeState, - styles: CanBeState<{ [Enums.ButtonStateType]: Style }>, - textIcon: CanBeState, isEnabled: CanBeState, - isDropShadow: CanBeState, + renderDatas: CanBeState<{ [Enums.ButtonStateType]: RenderData }>, hasMinimumSize: CanBeState?, cornerRadius: CanBeState?, paddingScale: CanBeState?, useRipple: CanBeState? ): Frame - local _fuse = ColdFusion.fuse(maid) + local fuse = ColdFusion.fuse(maid) - local _new = _fuse.new - local _bind = _fuse.bind - local _clone = _fuse.clone - local _import = _fuse.import + local _new = fuse.new + local _bind = fuse.bind + local _clone = fuse.clone + local _import = fuse.import - local _Value = _fuse.Value - local _Computed = _fuse.Computed + local _Value = fuse.Value + local _Computed = fuse.Computed local isEnabledState = _import(isEnabled, true) local isFocusedState = _Value(false) local isPressedState = _Value(false) @@ -92,43 +100,53 @@ return function( isHoveredState ) :: State - local stylesState = _import(styles, {}) :: any - local currentStyleState = _Computed( - function(state: Enums.ButtonStateType, styles: { [Enums.ButtonStateType]: Style }): Style - local style = styles[state] - assert(style ~= nil, `no style for {state}`) - return style + local renderDatasState = _import(renderDatas, {}) :: any + local currentRenderDataState = _Computed( + function(state: Enums.ButtonStateType, renderDatas: { [Enums.ButtonStateType]: RenderData }): RenderData + local renderData = renderDatas[state] + assert(renderData ~= nil, `no renderData for {state}`) + return renderData end, currentStateState, - stylesState + renderDatasState ) local sound = _new("Sound")({ - SoundId = _Computed(function(st: Style): string - return st.SoundId - end, currentStyleState), - Volume = _Computed(function(st: Style): number - return st.SoundVolume - end, currentStyleState) + SoundId = _Computed(function(st: RenderData): string + return if st.Sound then st.Sound.SoundId else "" + end, currentRenderDataState), + Volume = _Computed(function(st: RenderData): number + return if st.Sound then st.Sound.Volume else 0 + end, currentRenderDataState) }) :: Sound - currentStyleState:Connect(function() + currentRenderDataState:Connect(function() task.wait() SoundService:PlayLocalSound(sound) end) - local scaleState = _Computed(function(st: Style): number + local scaleState = _Computed(function(st: RenderData): number return st.Scale - end, currentStyleState) + end, currentRenderDataState) local onClickState = _import(onClick, function() end) local textState = _import(text, "") - local fontState = _import(font, Font.fromEnum(Enum.Font.SourceSansSemibold)) - local iconState = _import(textIcon, nil :: ImageData?) :: any + local fontState = _Computed(function(st: RenderData): Font + return if st.Font then st.Font.Font else Font.fromEnum(Enum.Font.Roboto) + end, currentRenderDataState) + local iconState = _Computed(function(st: RenderData): ImageData? + return if st.Image then st.Image else nil + end, currentRenderDataState) - local isDropShadowState = _import(isDropShadow, false) + local isDropShadowState = _Computed(function(st: RenderData): boolean + return st.Shadow ~= nil + end, currentRenderDataState) local hasMinState = _import(hasMinimumSize, true) local cornerRadiusState = _import(cornerRadius, SHAPE_DP) local paddingScaleState = _import(paddingScale, 1) local useRippleState = _import(useRipple, false) + local currentTextRenderData: State = sAssert( + fuse, + StyleUtil.getTextAppearanceData(fuse, currentRenderDataState) :: any + ) local inst: Frame @@ -156,7 +174,7 @@ return function( Enum.EasingDirection.In ) - local baseColor = (stylesState:Get()[Enums.ButtonStateType.Enabled] :: Style).BackgroundColor3 + local baseColor = (renderDatasState:Get()[Enums.ButtonStateType.Enabled] :: RenderData).Background.Color3 local rippleColor = (Color3.new(1, 1, 1):Lerp(baseColor, 0.8)):Lerp(baseColor, fadeAlpha) local leftOffset = @@ -199,9 +217,9 @@ return function( Image = "rbxassetid://15549395120", ImageColor3 = Color3.new(0, 0, 0), BackgroundTransparency = 1, - ImageTransparency = _Computed(function(style: Style, isDrop: boolean): number - return if style.BackgroundTransparency == 0 and isDrop then 0 else 1 - end, currentStyleState, isDropShadowState), + ImageTransparency = _Computed(function(renderData: RenderData, isDrop: boolean): number + return if renderData.Text and renderData.Text.Transparency == 0 and isDrop then 0 else 1 + end, currentRenderDataState, isDropShadowState), ScaleType = Enum.ScaleType.Slice, AutomaticSize = Enum.AutomaticSize.XY, SliceCenter = Rect.new(HALF_IMAGE_SIZE, HALF_IMAGE_SIZE, HALF_IMAGE_SIZE, HALF_IMAGE_SIZE), @@ -221,15 +239,15 @@ return function( _new("TextButton")({ Name = "TextButton", Text = "", - BackgroundTransparency = _Computed(function(style: Style): number - return style.BackgroundTransparency - end, currentStyleState), - BackgroundColor3 = _Computed(function(style: Style, useRip: boolean): Color3 + BackgroundTransparency = _Computed(function(renderData: RenderData): number + return renderData.Background.Transparency + end, currentRenderDataState), + BackgroundColor3 = _Computed(function(renderData: RenderData, useRip: boolean): Color3 if useRip then return Color3.new(1, 1, 1) end - return style.BackgroundColor3 - end, currentStyleState, useRippleState), + return renderData.Background.Color3 + end, currentRenderDataState, useRippleState), Active = isEnabledState, AutomaticSize = Enum.AutomaticSize.X, Size = _Computed(function(s: number): UDim2 @@ -279,34 +297,34 @@ return function( }), _new("UIGradient")({ Color = _Computed( - function(useRip: boolean, style: Style, seq: ColorSequence?): ColorSequence + function(useRip: boolean, renderData: RenderData, seq: ColorSequence?): ColorSequence if useRip then if seq then return seq else - return ColorSequence.new(style.BackgroundColor3) + return ColorSequence.new(renderData.Background.Color3) end else return ColorSequence.new(Color3.new(1, 1, 1)) end end, useRippleState, - currentStyleState, + currentRenderDataState, rippleColorState ), }), _new("UIStroke")({ ApplyStrokeMode = Enum.ApplyStrokeMode.Border, - Color = _Computed(function(style: Style): Color3 - return style.BorderColor3 - end, currentStyleState), + Color = _Computed(function(renderData: RenderData): Color3 + return renderData.Border.Color3 + end, currentRenderDataState), LineJoinMode = Enum.LineJoinMode.Round, Thickness = _Computed(function(s: number): number return math.max(s * 1, 1) end, scaleState), - Transparency = _Computed(function(style: Style): number - return style.BorderTransparency - end, currentStyleState), + Transparency = _Computed(function(renderData: RenderData): number + return renderData.Border.Transparency + end, currentRenderDataState), }), _new("UIListLayout")({ Padding = _Computed(function(s: number): UDim @@ -330,12 +348,12 @@ return function( AutomaticSize = Enum.AutomaticSize.X, FontFace = fontState, LayoutOrder = 2, - TextColor3 = _Computed(function(style: Style): Color3 - return style.TextColor3 - end, currentStyleState), - TextTransparency = _Computed(function(style: Style): number - return style.TextTransparency - end, currentStyleState), + TextColor3 = _Computed(function(renderData: AppearanceData): Color3 + return renderData.Color3 + end, currentTextRenderData), + TextTransparency = _Computed(function(renderData: AppearanceData): number + return renderData.Transparency + end, currentTextRenderData), Size = _Computed(function(s: number): UDim2 return UDim2.fromOffset(0, s * ICON_SIZE_DP) end, scaleState), @@ -350,18 +368,18 @@ return function( Image = _Computed(function(icon: ImageData?): string return if icon then icon.Image else "" end, iconState), - ImageColor3 = _Computed(function(icon: ImageData?, style: Style?): Color3 - return if icon and style then style.TextColor3 else Color3.new(1, 1, 1) - end, iconState, currentStyleState), + ImageColor3 = _Computed(function(icon: ImageData?, renderData: AppearanceData?): Color3 + return if icon and renderData then renderData.Color3 else Color3.new(1, 1, 1) + end, iconState, currentTextRenderData), ImageRectOffset = _Computed(function(icon: ImageData?): Vector2 return if icon then icon.ImageRectOffset else Vector2.zero end, iconState), ImageRectSize = _Computed(function(icon: ImageData?): Vector2 return if icon then icon.ImageRectSize else Vector2.zero end, iconState), - ImageTransparency = _Computed(function(icon: ImageData?, style: Style?): number - return if icon and style then style.TextTransparency else 1 - end, iconState, currentStyleState), + ImageTransparency = _Computed(function(icon: ImageData?, renderData: AppearanceData?): number + return if icon and renderData then renderData.Transparency else 1 + end, iconState, currentTextRenderData), SizeConstraint = Enum.SizeConstraint.RelativeYY, Size = _Computed(function(s: number): UDim2 return UDim2.fromScale(1, 1) @@ -430,3 +448,5 @@ return function( return inst end + +return Util \ No newline at end of file diff --git a/src/Component/Button/TextButton/init.luau b/src/Component/Button/TextButton/init.luau index 2e6cb778..c5765be4 100644 --- a/src/Component/Button/TextButton/init.luau +++ b/src/Component/Button/TextButton/init.luau @@ -12,16 +12,20 @@ local Sounds = require(_Package:WaitForChild("Sounds")) local Enums = require(_Package:WaitForChild("Enums")) local Types = require(_Package:WaitForChild("Types")) local Config = require(_Package:WaitForChild("Config")) -local Util = require(_Package:WaitForChild("Util")) local Base = require(script.Parent:WaitForChild("Base")) +local StyleUtil = require(_Package:WaitForChild("StyleUtil")) +local Typography = require(_Package:WaitForChild("Typography")) +local Theme = require(_Package:WaitForChild("Theme")) -- Types type Maid = Maid.Maid type State = ColdFusion.State type ValueState = ColdFusion.ValueState type CanBeState = ColdFusion.CanBeState -type TextStyle = Types.Style -type ImageData = Types.ImageData +type RenderData = Types.RenderData +type Typography = Typography.Typography +type Theme = Theme.Theme + -- Constants local DEFAULT_VOLUME = Config.Sound.Volume local HOVER_TRANSPARENCY = Config.Transparency.Background.Hovered @@ -36,13 +40,49 @@ local DISABLE_TRANSPARENCY = Config.Transparency.Text.Disabled -- Class local Interface = {} -function Interface.cfusion( +Interface.ColdFusion = {} + +function Interface.ColdFusion._new( onClick: CanBeState<() -> ()>, text: CanBeState, - styles: CanBeState<{ [Enums.ButtonStateType]: Style }>, - icon: CanBeState?, - isEnabled: CanBeState? -): ImageLabel + isEnabled: CanBeState, + renderStates: CanBeState<{[Enums.ButtonStateType]: RenderData}> +): GuiObject + local maid = Maid.new() + + local _fuse = ColdFusion.fuse(maid) + + local _new = _fuse.new + local _bind = _fuse.bind + local _clone = _fuse.clone + local _import = _fuse.import + + local _Value = _fuse.Value + local _Computed = _fuse.Computed + + local button = Base.component( + maid, + onClick, + text, + isEnabled, + renderStates, + nil, + nil, + nil + ) + maid.bind(button) + + return button +end + + +function Interface.ColdFusion.new( + onClick: CanBeState<() -> ()>, + text: CanBeState, + elevation: CanBeState, + theme: CanBeState, + typography: CanBeState +): GuiObject local maid = Maid.new() local _fuse = ColdFusion.fuse(maid) @@ -58,91 +98,22 @@ function Interface.cfusion( local onClickState = _import(onClick, function() end) local textState = _import(text, "") - local styles = _Computed(function(thm: ThemeData): { [Enums.ButtonStateType]: TextStyle } - local textColor: Color3? - if thm.IsDarkMode then - textColor = Util.getReadableColor( - thm.Color3, - if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.DARK_SURFACE - ) - else - textColor = Util.getReadableColor( - thm.Color3, - if thm.BackgroundColor3 then thm.BackgroundColor3 else Util.LIGHT_SURFACE - ) - end - assert(textColor) - textColor = Util.getElevatedColor(textColor, thm.Elevation, thm.IsDarkMode) - local data = { - [Enums.ButtonStateType.Enabled] = Types.newTextStyle(textColor, 0, textColor, 1, textColor, 1), - [Enums.ButtonStateType.Disabled] = Types.newTextStyle( - (function(): Color3 - if thm.IsDarkMode then - local h, _s, v = textColor:ToHSV() - return Util.getReadableColor( - Color3.fromHSV(h, 0, v), - if thm.BackgroundColor3 then thm.BackgroundColor3 else Color3.new(0.15, 0.15, 0.15) - ) - else - local h, _s, v = textColor:ToHSV() - return Util.getReadableColor( - Color3.fromHSV(h, 0, v), - if thm.BackgroundColor3 then thm.BackgroundColor3 else Color3.new(0.85, 0.85, 0.85) - ) - end - end)(), - DISABLE_TRANSPARENCY, - textColor, - 1, - textColor, - 1 - ), - [Enums.ButtonStateType.Focused] = Types.newTextStyle( - textColor, - 0, - textColor, - FOCUS_TRANSPARENCY, - textColor, - 1 - ), - [Enums.ButtonStateType.Hovered] = Types.newTextStyle( - textColor, - 0, - textColor, - HOVER_TRANSPARENCY, - textColor, - 1 - ), - [Enums.ButtonStateType.Pressed] = Types.newTextStyle( - textColor, - 0, - textColor, - PRESS_TRANSPARENCY, - textColor, - 1 - ), - } - return data - end, themeState) - - local button = Base( - maid, - onClickState, - textState, - _Computed(function(t: ThemeData): Font - return t.Font - end, themeState), - styles, - icon, - if isEnabled == nil then true else isEnabled, - false, - _Computed(function(t: ThemeData): number - return t.Scale - end, themeState), - sound - ) + local enabledStyleState = StyleUtil.newRenderData( + _fuse, + nil, + nil, + nil, + nil, + nil, + nil, + nil, + nil + ) + maid.bind(button) + return button end + return Interface diff --git a/src/Enums.luau b/src/Enums.luau index 8ae7a1bd..00cf73a7 100644 --- a/src/Enums.luau +++ b/src/Enums.luau @@ -1,45 +1,298 @@ --strict -- this script was generated by nightcycle/pseudo-enum, do not manually edit -export type ButtonStateType = "Enabled" | "Disabled" | "Hovered" | "Focused" | "Pressed" -local ButtonStateTypeList = { "Enabled", "Disabled", "Hovered", "Focused", "Pressed" } -export type EnumName = "ButtonStateType" +export type FontType = ("DisplayLarge" + +| "DisplayMedium" + +| "DisplaySmall" + +| "HeadlineLarge" + +| "HeadlineMedium" + +| "HeadlineSmall" + +| "TitleLarge" + +| "TitleMedium" + +| "TitleSmall" + +| "BodyLarge" + +| "BodyMedium" + +| "BodySmall" + +| "LabelLarge" + +| "LabelMedium" + +| "LabelSmall" + +) + +local FontTypeList = {"DisplayLarge","DisplayMedium","DisplaySmall","HeadlineLarge","HeadlineMedium","HeadlineSmall","TitleLarge","TitleMedium","TitleSmall","BodyLarge","BodyMedium","BodySmall","LabelLarge","LabelMedium","LabelSmall",} + +export type ButtonStateType = ("Enabled" + +| "Disabled" + +| "Hovered" + +| "Focused" + +| "Pressed" + +) + +local ButtonStateTypeList = {"Enabled","Disabled","Hovered","Focused","Pressed",} + +export type SchemeType = ("Light" + +| "Dark" + +) + +local SchemeTypeList = {"Light","Dark",} + +export type ColorRoleType = ("Primary" + +| "Secondary" + +| "Tertiary" + +| "Error" + +| "Background" + +| "Surface" + +| "Outline" + +| "Shadow" + +| "Scrim" + +) + +local ColorRoleTypeList = {"Primary","Secondary","Tertiary","Error","Background","Surface","Outline","Shadow","Scrim",} + +export type ColorContextType = ("Default" + +| "On" + +| "Container" + +| "OnContainer" + +| "Surface" + +| "Dim" + +| "Bright" + +| "Lowest" + +| "Low" + +| "High" + +| "Highest" + +| "Tint" + +| "Variant" + +| "OnVariant" + +| "Inverse" + +| "InverseOn" + +) + +local ColorContextTypeList = {"Default","On","Container","OnContainer","Surface","Dim","Bright","Lowest","Low","High","Highest","Tint","Variant","OnVariant","Inverse","InverseOn",} + +export type PaletteType = ("Primary" + +| "Secondary" + +| "Tertiary" + +| "Neutral" + +| "NeutralVariant" + +| "Error" + +) + +local PaletteTypeList = {"Primary","Secondary","Tertiary","Neutral","NeutralVariant","Error",} +export type EnumName = ("FontType" + +| "ButtonStateType" + +| "SchemeType" + +| "ColorRoleType" + +| "ColorContextType" + +| "PaletteType" + +) return { - getEnumItems = function(enumName: EnumName): { [number]: string } - if enumName == "ButtonStateType" then + getEnumItems = function(enumName: EnumName): {[number]: string} + if enumName == "FontType" then + return table.clone(FontTypeList) + elseif enumName == "ButtonStateType" then return table.clone(ButtonStateTypeList) + elseif enumName == "SchemeType" then + return table.clone(SchemeTypeList) + elseif enumName == "ColorRoleType" then + return table.clone(ColorRoleTypeList) + elseif enumName == "ColorContextType" then + return table.clone(ColorContextTypeList) + elseif enumName == "PaletteType" then + return table.clone(PaletteTypeList) end - error("bad enum name: " .. tostring(enumName)) + error("bad enum name: "..tostring(enumName)) end, getEnumItemFromValue = function(enumName: EnumName, value: number): string - if enumName == "ButtonStateType" then - if ButtonStateTypeList[value] then - return ButtonStateTypeList[value] - else - error("no enum item of value " .. tostring(value) .. " in enum " .. tostring(enumName)) - end + if enumName == "FontType" then + if FontTypeList[value] then return FontTypeList[value] else error("no enum item of value "..tostring(value).." in enum "..tostring(enumName)) end + elseif enumName == "ButtonStateType" then + if ButtonStateTypeList[value] then return ButtonStateTypeList[value] else error("no enum item of value "..tostring(value).." in enum "..tostring(enumName)) end + elseif enumName == "SchemeType" then + if SchemeTypeList[value] then return SchemeTypeList[value] else error("no enum item of value "..tostring(value).." in enum "..tostring(enumName)) end + elseif enumName == "ColorRoleType" then + if ColorRoleTypeList[value] then return ColorRoleTypeList[value] else error("no enum item of value "..tostring(value).." in enum "..tostring(enumName)) end + elseif enumName == "ColorContextType" then + if ColorContextTypeList[value] then return ColorContextTypeList[value] else error("no enum item of value "..tostring(value).." in enum "..tostring(enumName)) end + elseif enumName == "PaletteType" then + if PaletteTypeList[value] then return PaletteTypeList[value] else error("no enum item of value "..tostring(value).." in enum "..tostring(enumName)) end end - error("bad enum name: " .. tostring(enumName)) + error("bad enum name: "..tostring(enumName)) end, - getValueFromEnumItem = function(enumName: EnumName, enumItem: string): number - if enumName == "ButtonStateType" then +getValueFromEnumItem = function(enumName: EnumName, enumItem: string): number + if enumName == "FontType" then + local index = table.find(FontTypeList, enumItem) + if index then + assert(index) + return index + else + error("no enumItem "..enumItem.." in FontType") + end + elseif enumName == "ButtonStateType" then local index = table.find(ButtonStateTypeList, enumItem) if index then assert(index) return index else - error("no enumItem " .. enumItem .. " in ButtonStateType") + error("no enumItem "..enumItem.." in ButtonStateType") + end + elseif enumName == "SchemeType" then + local index = table.find(SchemeTypeList, enumItem) + if index then + assert(index) + return index + else + error("no enumItem "..enumItem.." in SchemeType") + end + elseif enumName == "ColorRoleType" then + local index = table.find(ColorRoleTypeList, enumItem) + if index then + assert(index) + return index + else + error("no enumItem "..enumItem.." in ColorRoleType") + end + elseif enumName == "ColorContextType" then + local index = table.find(ColorContextTypeList, enumItem) + if index then + assert(index) + return index + else + error("no enumItem "..enumItem.." in ColorContextType") + end + elseif enumName == "PaletteType" then + local index = table.find(PaletteTypeList, enumItem) + if index then + assert(index) + return index + else + error("no enumItem "..enumItem.." in PaletteType") end end - error("bad enum name: " .. tostring(enumName)) + error("bad enum name: "..tostring(enumName)) end, - ButtonStateType = { - ["Enabled"] = "Enabled", - ["Disabled"] = "Disabled", - ["Hovered"] = "Hovered", - ["Focused"] = "Focused", - ["Pressed"] = "Pressed", - }, -} +FontType = { + ["DisplayLarge"] = "DisplayLarge", + ["DisplayMedium"] = "DisplayMedium", + ["DisplaySmall"] = "DisplaySmall", + ["HeadlineLarge"] = "HeadlineLarge", + ["HeadlineMedium"] = "HeadlineMedium", + ["HeadlineSmall"] = "HeadlineSmall", + ["TitleLarge"] = "TitleLarge", + ["TitleMedium"] = "TitleMedium", + ["TitleSmall"] = "TitleSmall", + ["BodyLarge"] = "BodyLarge", + ["BodyMedium"] = "BodyMedium", + ["BodySmall"] = "BodySmall", + ["LabelLarge"] = "LabelLarge", + ["LabelMedium"] = "LabelMedium", + ["LabelSmall"] = "LabelSmall", +}, +ButtonStateType = { + ["Enabled"] = "Enabled", + ["Disabled"] = "Disabled", + ["Hovered"] = "Hovered", + ["Focused"] = "Focused", + ["Pressed"] = "Pressed", +}, +SchemeType = { + ["Light"] = "Light", + ["Dark"] = "Dark", +}, +ColorRoleType = { + ["Primary"] = "Primary", + ["Secondary"] = "Secondary", + ["Tertiary"] = "Tertiary", + ["Error"] = "Error", + ["Background"] = "Background", + ["Surface"] = "Surface", + ["Outline"] = "Outline", + ["Shadow"] = "Shadow", + ["Scrim"] = "Scrim", +}, +ColorContextType = { + ["Default"] = "Default", + ["On"] = "On", + ["Container"] = "Container", + ["OnContainer"] = "OnContainer", + ["Surface"] = "Surface", + ["Dim"] = "Dim", + ["Bright"] = "Bright", + ["Lowest"] = "Lowest", + ["Low"] = "Low", + ["High"] = "High", + ["Highest"] = "Highest", + ["Tint"] = "Tint", + ["Variant"] = "Variant", + ["OnVariant"] = "OnVariant", + ["Inverse"] = "Inverse", + ["InverseOn"] = "InverseOn", +}, +PaletteType = { + ["Primary"] = "Primary", + ["Secondary"] = "Secondary", + ["Tertiary"] = "Tertiary", + ["Neutral"] = "Neutral", + ["NeutralVariant"] = "NeutralVariant", + ["Error"] = "Error", +}, +} \ No newline at end of file diff --git a/src/Style.luau b/src/Style.luau new file mode 100644 index 00000000..5885617a --- /dev/null +++ b/src/Style.luau @@ -0,0 +1,47 @@ +--!strict +local _Package = script.Parent +local _Packages = _Package.Parent +-- Services +-- Packages +-- Modules +local Typography = require(_Package:WaitForChild("Typography")) +local Theme = require(_Package:WaitForChild("Theme")) +-- Types +type Theme = Theme.Theme +type Typography = Typography.Typography +-- Constants +-- Variables +-- References +-- Private Functions +-- Class +-- Types +export type Style = { + __index: Style, + Theme: Theme, + Typography: Typography, + new: ( + fontFamily: string, + source: Color3, + custom: {[string]: Color3}? + ) -> Style, +} + +-- Class +local Style = {} :: Style +Style.__index = Style + +function Style.new( + fontFamily: string, + source: Color3, + additions: {[string]: Color3}? +) + + local self: Style = setmetatable({}, Style) :: any + + self.Theme = Theme.new(source, additions) + self.Typography = Typography.new(fontFamily) + + return self +end + +return Style \ No newline at end of file diff --git a/src/StyleUtil.luau b/src/StyleUtil.luau new file mode 100644 index 00000000..896d3a45 --- /dev/null +++ b/src/StyleUtil.luau @@ -0,0 +1,270 @@ +--!strict +local _Package = script.Parent +local _Packages = _Package.Parent +-- Services +-- Packages +local ColdFusion = require(_Packages:WaitForChild("ColdFusion")) + +-- Modules +local Enums = require(_Package:WaitForChild("Enums")) +local Theme = require(_Package:WaitForChild("Theme")) +local Typography = require(_Package:WaitForChild("Typography")) +local Types = require(_Package:WaitForChild("Types")) + +-- Types +type Fuse = ColdFusion.Fuse +type State = ColdFusion.State +type CanBeState = ColdFusion.CanBeState +type Theme = Theme.Theme +type Typography = Typography.Typography +type FontData = Types.FontData +type RenderData = Types.RenderData +type SoundData = Types.SoundData +type ImageData = Types.ImageData +type AppearanceData = Types.AppearanceData +type ShadowData = Types.ShadowData +-- Constants +local FALLBACK_FONT_DATA = Types.newFontData(Font.fromEnum(Enum.Font.Roboto), 14) +-- Variables +-- References +-- Private Functions +-- Class +local Util = {} + +function Util.newColor( + fuse: Fuse, + elevation: CanBeState, + schemeType: CanBeState, + role: CanBeState, + context: CanBeState, + theme: CanBeState +): State + + local elevationState = fuse.import(elevation, 1) + local schemeTypeState = fuse.import(schemeType, Enums.SchemeType.Dark) + local roleState = fuse.import(role, Enums.ColorRoleType.Primary) + local contextState = fuse.import(context, Enums.ColorContextType.Default) + local themeState: State = fuse.import(theme, nil :: any) + + return fuse.Computed(function(elev: number, scheme: Enums.SchemeType, r: Enums.ColorRoleType, c: Enums.ColorContextType, th: Theme): Color3 + return th:Get( + r, + c, + scheme, + elev + ) + end, elevationState, schemeTypeState, roleState, contextState, themeState) +end + +function Util.newFontData( + fuse: Fuse, + fontType: CanBeState, + typography: CanBeState +): State + local fontTypeState = fuse.import(fontType, "BodyMedium" :: Enums.FontType) + local typographyState = fuse.import(typography, nil :: any) + + return fuse.Computed(function(fT: Enums.FontType, t: Typography): FontData + local fontData = t:Get(fT) + return fontData + end, fontTypeState, typographyState) +end + +function Util.newFont( + fuse: Fuse, + fontData: CanBeState +): State + local fontDataState = fuse.import(fontData, FALLBACK_FONT_DATA) + + return fuse.Computed(function(data: FontData): Font + return data.Font + end, fontDataState) +end + +function Util.newLineHeight( + fuse: Fuse, + fontData: CanBeState, + scale: CanBeState +): State + + local fontDataState = fuse.import(fontData, FALLBACK_FONT_DATA) + + local scaleState = fuse.import(scale, 1) + + return fuse.Computed(function(data: FontData, s: number): number + return (data.LineHeight / data.Size) * s + end, fontDataState, scaleState) +end + +function Util.newTextSize( + fuse: Fuse, + fontData: CanBeState, + scale: CanBeState +): State + + local fontDataState = fuse.import(fontData, FALLBACK_FONT_DATA) + local scaleState = fuse.import(scale, 1) + + return fuse.Computed(function(data: FontData, s: number): number + return data.Size * s + end, fontDataState, scaleState) +end + +function Util.newSoundData( + fuse: Fuse, + soundId: CanBeState, + volume: CanBeState +): State + + local soundIdState = fuse.import(soundId, "") + local volumeState = fuse.import(volume, nil :: number?) + + return fuse.Computed(function(s: string, v: number?): SoundData + return Types.newSoundData(s, v) + end, soundIdState, volumeState) +end + +function Util.newShadowData( + fuse: Fuse, + appearanceData: CanBeState, + offset: CanBeState +): State + + local appearanceDataState: State = fuse.import(appearanceData, nil :: any) + local offsetState: State = fuse.import(offset, nil :: Vector2?) + + return fuse.Computed(Types.newShadow, appearanceDataState, offsetState) +end + +function Util.newRenderData( + fuse: Fuse, + scale: CanBeState, + border: CanBeState, + background: CanBeState, + text: CanBeState, + font: CanBeState, + image: CanBeState, + sound: CanBeState, + shadow: CanBeState +): State + + local borderState: State = fuse.import(border, nil :: any) + local backgroundState: State = fuse.import(background, nil :: any) + local textState: State = fuse.import(text, nil :: any) + local fontState: State = fuse.import(font, nil :: any) + local imageState: State = fuse.import(image, nil :: any) + local soundState: State = fuse.import(sound, nil :: any) + local shadowState: State = fuse.import(shadow, nil :: any) + + local scaleState = fuse.import(scale, 1) + + return fuse.Computed(Types.newRenderData, scaleState, borderState, backgroundState, textState, fontState, imageState, soundState, shadowState) +end + +function Util.getScale( + fuse: Fuse, + renderData: CanBeState +): State + local renderDataState = fuse.import(renderData, nil :: RenderData?) + return fuse.Computed(function(st: RenderData): number + return st.Scale + end, renderDataState) +end + +function Util.getBorderAppearanceData( + fuse: Fuse, + renderData: CanBeState +): State + local renderDataState = fuse.import(renderData, nil :: RenderData?) + return fuse.Computed(function(st: RenderData): AppearanceData + return st.Border + end, renderDataState) +end + +function Util.getBackgroundAppearanceData( + fuse: Fuse, + renderData: CanBeState +): State + local renderDataState = fuse.import(renderData, nil :: RenderData?) + return fuse.Computed(function(st: RenderData): AppearanceData + return st.Background + end, renderDataState) +end + +function Util.getTextAppearanceData( + fuse: Fuse, + renderData: CanBeState +): State + local renderDataState = fuse.import(renderData, nil :: RenderData?) + + return fuse.Computed(function(st: RenderData): AppearanceData? + return st.Text + end, renderDataState) +end + +function Util.getImageData( + fuse: Fuse, + renderData: CanBeState +): State + local renderDataState = fuse.import(renderData, nil :: RenderData?) + + return fuse.Computed(function(st: RenderData): ImageData? + return st.Image + end, renderDataState) +end + +function Util.getFontData( + fuse: Fuse, + renderData: CanBeState +): State + local renderDataState = fuse.import(renderData, nil :: RenderData?) + + return fuse.Computed(function(st: RenderData): FontData? + return st.Font + end, renderDataState) +end + +function Util.getSoundData( + fuse: Fuse, + renderData: CanBeState +): State + + local renderDataState = fuse.import(renderData, nil :: RenderData?) + + return fuse.Computed(function(st: RenderData): SoundData? + return st.Sound + end, renderDataState) +end + +function Util.getShadowData( + fuse: Fuse, + renderData: CanBeState +): State + + local renderDataState = fuse.import(renderData, nil :: RenderData?) + + return fuse.Computed(function(st: RenderData): ShadowData? + return st.Shadow + end, renderDataState) +end + +function Util.assert(fuse: Fuse, state: State): State + return fuse.Computed(function(t: T?): T + assert(t ~= nil) + return t + end, state) +end + +function Util.isNil(fuse: Fuse, state: State): State + return fuse.Computed(function(t: T?): boolean + return t == nil + end, state) +end + +function Util.inverse(fuse: Fuse, state: State): State + return fuse.Computed(function(v: boolean): boolean + return not v + end, state) +end + +return Util \ No newline at end of file diff --git a/src/Theme/HCT/init.luau b/src/Theme/HCT/init.luau index b7275a3d..d131acf2 100644 --- a/src/Theme/HCT/init.luau +++ b/src/Theme/HCT/init.luau @@ -15,6 +15,7 @@ export type HCT = { _internalTone: number, from: (hue: number, chroma: number, tone: number) -> HCT, fromInt: (argb: number) -> HCT, + fromColor3: (color3: Color3) -> HCT, new: (argb: number) -> HCT, setHue: (self: HCT, newHue: number) -> (), setChroma: (self: HCT, newChroma: number) -> (), @@ -23,6 +24,7 @@ export type HCT = { getChroma: (self: HCT) -> number, getTone: (self: HCT) -> number, toInt: (self: HCT) -> number, + toColor3: (self: HCT) -> Color3, _setInternalState: (self: HCT, argb: number) -> (), inViewingConditions: (self: HCT, vc: ViewingConditions) -> (), } @@ -92,4 +94,100 @@ function HCT.fromInt(argb: number): HCT return HCT.new(argb) end +function HCT.fromColor3(color3: Color3): HCT + local function rgbToXyz(r: number, g: number, b: number): (number, number, number) + -- Assuming sRGB color space and using a common conversion formula + r = (r > 0.04045) and ((r + 0.055) / 1.055) ^ 2.4 or r / 12.92 + g = (g > 0.04045) and ((g + 0.055) / 1.055) ^ 2.4 or g / 12.92 + b = (b > 0.04045) and ((b + 0.055) / 1.055) ^ 2.4 or b / 12.92 + + -- Convert to XYZ using the RGB to XYZ matrix for sRGB + local x = r * 0.4124564 + g * 0.3575761 + b * 0.1804375 + local y = r * 0.2126729 + g * 0.7151522 + b * 0.0721750 + local z = r * 0.0193339 + g * 0.1191920 + b * 0.9503041 + + return x, y, z + end + + local function xyzToLab(x: number, y: number, z: number): (number, number, number) + -- Observer = 2°, Illuminant = D65 + local refX, refY, refZ = 0.95047, 1.00000, 1.08883 + x = x / refX + y = y / refY + z = z / refZ + + x = (x > 0.008856) and x ^ (1 / 3) or (7.787 * x) + (16 / 116) + y = (y > 0.008856) and y ^ (1 / 3) or (7.787 * y) + (16 / 116) + z = (z > 0.008856) and z ^ (1 / 3) or (7.787 * z) + (16 / 116) + + local l = (116 * y) - 16 + local a = 500 * (x - y) + local b = 200 * (y - z) + + return l, a, b + end + + local function labToHct(l: number, a: number, b: number): (number, number, number) + -- Convert LAB to HCT (Hue, Chroma, Tone) + local hue = math.deg(math.atan2(b, a)) + if hue < 0 then + hue = hue + 360 + end + + local chroma = math.sqrt(a ^ 2 + b ^ 2) + local tone = l -- In LAB, L* represents lightness which is analogous to tone + + return hue, chroma, tone + end + + return HCT.from(labToHct(xyzToLab(rgbToXyz(color3.R, color3.G, color3.B)))) +end + +function HCT:toColor3(): Color3 + local function hctToLab(hue: number, chroma: number, tone: number): (number, number, number) + -- Convert HCT back to LAB + local a = chroma * math.cos(math.rad(hue)) + local b = chroma * math.sin(math.rad(hue)) + local l = tone -- In LAB, L* represents lightness which is analogous to tone + return l, a, b + end + + local function labToXyz(l: number, a: number, b: number): (number, number, number) + local y = (l + 16) / 116 + local x = a / 500 + y + local z = y - b / 200 + + -- Observer= 2°, Illuminant= D65 + local refX, refY, refZ = 0.95047, 1.00000, 1.08883 + x = (x ^ 3 > 0.008856) and x ^ 3 or (x - 16 / 116) / 7.787 + y = (y ^ 3 > 0.008856) and y ^ 3 or (y - 16 / 116) / 7.787 + z = (z ^ 3 > 0.008856) and z ^ 3 or (z - 16 / 116) / 7.787 + + x = refX * x + y = refY * y + z = refZ * z + + return x, y, z + end + + local function xyzToRgb(x: number, y: number, z: number): (number, number, number) + -- Convert XYZ to RGB + local r = x * 3.2406 + y * -1.5372 + z * -0.4986 + local g = x * -0.9689 + y * 1.8758 + z * 0.0415 + local b = x * 0.0557 + y * -0.2040 + z * 1.0570 + + r = (r > 0.0031308) and 1.055 * (r ^ (1 / 2.4)) - 0.055 or 12.92 * r + g = (g > 0.0031308) and 1.055 * (g ^ (1 / 2.4)) - 0.055 or 12.92 * g + b = (b > 0.0031308) and 1.055 * (b ^ (1 / 2.4)) - 0.055 or 12.92 * b + + -- Clamp the values to the 0-1 range + r = math.max(0, math.min(1, r)) + g = math.max(0, math.min(1, g)) + b = math.max(0, math.min(1, b)) + + return r, g, b + end + return Color3.new(xyzToRgb(labToXyz(hctToLab(self:getHue(), self:getChroma(), self:getTone())))) +end + return HCT diff --git a/src/Theme/Palette.story.luau b/src/Theme/Palette.story.luau new file mode 100644 index 00000000..f29ab99d --- /dev/null +++ b/src/Theme/Palette.story.luau @@ -0,0 +1,57 @@ +--!strict +-- Services +-- Packages +local Maid = require(game:GetService("ReplicatedStorage"):WaitForChild("Packages"):WaitForChild("Maid")) +-- Modules +local Enums = require(script.Parent.Parent:WaitForChild("Enums")) +-- Types +-- Constants +-- Variables +-- References +-- Class +return function(frame: Frame) + local maid = Maid.new() + task.spawn(function() + local Theme = require(script.Parent) + local theme = Theme.new( + Color3.new(0.7,0.7,0), + {} + ) + + local function displayScheme(palette: Enums.PaletteType): Frame + local halfFrame = maid:GiveTask(Instance.new("Frame")) + halfFrame.Size = UDim2.fromScale(1/6,1) + + local listLayout = maid:GiveTask(Instance.new("UIListLayout")) + listLayout.FillDirection = Enum.FillDirection.Vertical + listLayout.Padding = UDim.new(0, 0) + listLayout.SortOrder = Enum.SortOrder.LayoutOrder + listLayout.VerticalAlignment = Enum.VerticalAlignment.Center + listLayout.HorizontalAlignment = Enum.HorizontalAlignment.Center + listLayout.Parent = halfFrame + + for i=0, 10 do + local label = Instance.new("TextLabel") + label.TextColor3 = Color3.new(0.5,0.5,0.5) + label.Text = `{i*100}` + label.BackgroundColor3 = theme.Palettes[palette](i/10) + label.LayoutOrder = i + label.Size = UDim2.fromScale(1, 1/11) + label.TextScaled = true + label.Parent = halfFrame + end + + return halfFrame + end + + local pTypes = Enums.getEnumItems("PaletteType") + for i, pT in ipairs(pTypes) do + local sch = displayScheme(Enums.PaletteType.Primary) + sch.Position = UDim2.fromScale((i-1)/#pTypes,0) + sch.Parent = frame + end + end) + return function() + maid:Destroy() + end +end \ No newline at end of file diff --git a/src/Theme/Scheme.story.luau b/src/Theme/Scheme.story.luau new file mode 100644 index 00000000..4f0fd4a3 --- /dev/null +++ b/src/Theme/Scheme.story.luau @@ -0,0 +1,76 @@ +--!strict +local ReplicatedStorage = game:GetService("ReplicatedStorage") +-- Services +-- Packages +local Enums = require(ReplicatedStorage.Packages.synthetic.Enums) +local Maid = require(game:GetService("ReplicatedStorage"):WaitForChild("Packages"):WaitForChild("Maid")) +-- Modules +-- Types +-- Constants + +-- Variables +-- References +-- Class +return function(frame: Frame) + local maid = Maid.new() + task.spawn(function() + local Theme = require(script.Parent) + + + local function displayScheme(schemeType: Enums.SchemeType): Frame + local theme = Theme.new( + Color3.new(0.8,0,0.8) + ) + local scheme = theme._Schemes[schemeType] + local halfFrame = maid:GiveTask(Instance.new("Frame")) + + local listLayout = maid:GiveTask(Instance.new("UIListLayout")) + listLayout.FillDirection = Enum.FillDirection.Vertical + listLayout.Padding = UDim.new(0.01, 0) + listLayout.SortOrder = Enum.SortOrder.LayoutOrder + listLayout.VerticalAlignment = Enum.VerticalAlignment.Center + listLayout.HorizontalAlignment = Enum.HorizontalAlignment.Center + listLayout.Parent = halfFrame + + local contextCounts = #Enums.getEnumItems("ColorContextType") + + for role, contexts in pairs(scheme) do + for context, v in pairs(contexts) do + local label = Instance.new("TextLabel") + label.TextColor3 = Color3.new(0.5,0.5,0.5) + label.Text = `{role}-{context}` + label.BackgroundColor3 = v + label.LayoutOrder = (Enums.getValueFromEnumItem("ColorRoleType", role) * contextCounts) + Enums.getValueFromEnumItem("ColorRoleType", role) + label.Size = UDim2.fromScale(0.9, 1/50) + label.TextScaled = true + label.Parent = halfFrame + end + end + + return halfFrame + end + + do + local light = displayScheme(Enums.SchemeType.Light) + light.BackgroundColor3 = Color3.new(0.85, 0.85, 0.85) + light.Position = UDim2.fromScale(0,0) + light.Size = UDim2.fromScale(0.25,1) + light.Parent = frame + end + + + + do + local dark = displayScheme(Enums.SchemeType.Light) + dark.BackgroundColor3 = Color3.new(0.15, 0.15, 0.15) + dark.Position = UDim2.fromScale(0.5,0) + dark.Size = UDim2.fromScale(0.25,1) + dark.Parent = frame + end + + + end) + return function() + maid:Destroy() + end +end \ No newline at end of file diff --git a/src/Theme/Scheme/init.luau b/src/Theme/Scheme/init.luau index dd7455e2..01e13c77 100644 --- a/src/Theme/Scheme/init.luau +++ b/src/Theme/Scheme/init.luau @@ -34,6 +34,15 @@ export type SchemeData = { inverseSurface: number, inverseOnSurface: number, inversePrimary: number, + + surfaceDim: number, + surfaceBright: number, + surfaceContainerLowest: number, + surfaceContainerLow: number, + surfaceContainer: number, + surfaceContainerHigh: number, + surfaceContainerHighest: number, + surfaceTint: number, } export type Scheme = { @@ -103,7 +112,16 @@ function Scheme.lightFromCorePalette(core: CorePalette): Scheme scrim= core.n1:getTone(0), inverseSurface= core.n1:getTone(20), inverseOnSurface= core.n1:getTone(95), - inversePrimary= core.a1:getTone(80) + inversePrimary= core.a1:getTone(80), + + surfaceDim= core.n1:getTone(87), + surfaceBright= core.n1:getTone(98), + surfaceContainerLowest= core.n1:getTone(100), + surfaceContainerLow= core.n1:getTone(96), + surfaceContainer= core.n1:getTone(94), + surfaceContainerHigh= core.n1:getTone(92), + surfaceContainerHighest= core.n1:getTone(90), + surfaceTint= core.n1:getTone(40), }); end @@ -137,7 +155,16 @@ function Scheme.darkFromCorePalette(core: CorePalette): Scheme scrim= core.n1:getTone(0), inverseSurface= core.n1:getTone(90), inverseOnSurface= core.n1:getTone(20), - inversePrimary= core.a1:getTone(40) + inversePrimary= core.a1:getTone(40), + + surfaceDim= core.n1:getTone(6), + surfaceBright= core.n1:getTone(24), + surfaceContainerLowest= core.n1:getTone(4), + surfaceContainerLow= core.n1:getTone(10), + surfaceContainer= core.n1:getTone(12), + surfaceContainerHigh= core.n1:getTone(17), + surfaceContainerHighest= core.n1:getTone(22), + surfaceTint= core.n1:getTone(80), }); end diff --git a/src/Theme/Test.story.luau b/src/Theme/Test.story.luau deleted file mode 100644 index a3e0ab18..00000000 --- a/src/Theme/Test.story.luau +++ /dev/null @@ -1,94 +0,0 @@ ---!strict --- Services --- Packages -local Maid = require(game:GetService("ReplicatedStorage"):WaitForChild("Packages"):WaitForChild("Maid")) --- Modules --- Types --- Constants -local ORDER = { - "Primary", - "OnPrimary", - "PrimaryContainer", - "OnPrimaryContainer", - "Secondary", - "OnSecondary", - "SecondaryContainer", - "OnSecondaryContainer", - "Tertiary", - "OnTertiary", - "TertiaryContainer", - "OnTertiaryContainer", - "Error", - "OnError", - "ErrorContainer", - "OnErrorContainer", - "Background", - "OnBackground", - "Surface", - "OnSurface", - "SurfaceVariant", - "OnSurfaceVariant", - "Outline", - "OutlineVariant", - "Shadow", - "Scrim", - "InverseSurface", - 'InverseOnSurface', - "InversePrimary", -} --- Variables --- References --- Class -return function(frame: Frame) - local maid = Maid.new() - task.spawn(function() - local Theme = require(script.Parent) - local theme = Theme.new( - Color3.new(0.8,0,0.8), - {} - ) - - local function displayScheme(scheme: Theme.Scheme): Frame - local halfFrame = maid:GiveTask(Instance.new("Frame")) - - local listLayout = maid:GiveTask(Instance.new("UIListLayout")) - listLayout.FillDirection = Enum.FillDirection.Vertical - listLayout.Padding = UDim.new(0.01, 0) - listLayout.SortOrder = Enum.SortOrder.LayoutOrder - listLayout.VerticalAlignment = Enum.VerticalAlignment.Center - listLayout.HorizontalAlignment = Enum.HorizontalAlignment.Center - listLayout.Parent = halfFrame - - for k, v in pairs(scheme) do - local label = Instance.new("TextLabel") - label.TextColor3 = Color3.new(0.5,0.5,0.5) - label.Text = k - label.BackgroundColor3 = v - local i = table.find(ORDER, k) - assert(i, `bad order for {k}`) - label.LayoutOrder = i - label.Size = UDim2.fromScale(0.9, 1/50) - label.TextScaled = true - label.Parent = halfFrame - end - - return halfFrame - end - - local light = displayScheme(theme.Schemes.Light) - light.BackgroundColor3 = Color3.new(0.85, 0.85, 0.85) - light.Position = UDim2.fromScale(0,0) - light.Size = UDim2.fromScale(0.5,1) - light.Parent = frame - - local dark = displayScheme(theme.Schemes.Dark) - dark.BackgroundColor3 = Color3.new(0.15, 0.15, 0.15) - dark.Position = UDim2.fromScale(0.5,0) - dark.Size = UDim2.fromScale(0.5,1) - dark.Parent = frame - - end) - return function() - maid:Destroy() - end -end \ No newline at end of file diff --git a/src/Theme/init.luau b/src/Theme/init.luau index 8e04eecf..3b8dcd19 100644 --- a/src/Theme/init.luau +++ b/src/Theme/init.luau @@ -1,9 +1,13 @@ --!strict +local _Package = script.Parent +local _Packages = _Package.Parent -- Services -- Packages -- Modules local ThemeUtil = require(script:WaitForChild("ThemeUtil")) local HCT = require(script:WaitForChild("HCT")) +local Enums = require(script.Parent:WaitForChild("Enums")) +local Blend = require(script:WaitForChild("Blend")) -- Types type GoogleHCT = HCT.HCT @@ -12,190 +16,72 @@ type GoogleTheme = ThemeUtil.Theme type GoogleScheme = ThemeUtil.Scheme type GoogleTonalPalette = ThemeUtil.TonalPalette type GoogleColorGroup = ThemeUtil.ColorGroup -export type Scheme = { - Primary: Color3, - OnPrimary: Color3, - PrimaryContainer: Color3, - OnPrimaryContainer: Color3, - Secondary: Color3, - OnSecondary: Color3, - SecondaryContainer: Color3, - OnSecondaryContainer: Color3, - Tertiary: Color3, - OnTertiary: Color3, - TertiaryContainer: Color3, - OnTertiaryContainer: Color3, - Error: Color3, - OnError: Color3, - ErrorContainer: Color3, - OnErrorContainer: Color3, - Background: Color3, - OnBackground: Color3, - Surface: Color3, - OnSurface: Color3, - SurfaceVariant: Color3, - OnSurfaceVariant: Color3, - Outline: Color3, - OutlineVariant: Color3, - Shadow: Color3, - Scrim: Color3, - InverseSurface: Color3, - InverseOnSurface: Color3, - InversePrimary: Color3, -} -export type TonalPalette = { - [number]: Color3 -} -export type ColorGroup = { - Color: Color3, - OnColor: Color3, - ColorContainer: Color3, - OnColorContainer: Color3, -} +export type Scheme = {[Enums.ColorRoleType]: {[Enums.ColorContextType]: Color3}} +export type TonalPalette = (alpha: number, noClamp: boolean?) -> Color3 export type CustomColorGroup = { Name: string, Value: number, IsBlended: boolean, - Light: ColorGroup, - Dark: ColorGroup, + Schemes: { + [Enums.SchemeType]: {[Enums.ColorContextType]: Color3}, + }, } export type Theme = { + __index: Theme, Source: Color3, - Schemes: { - Light: Scheme, - Dark: Scheme - }, - Palettes: { - Primary: TonalPalette, - Secondary: TonalPalette, - Tertiary: TonalPalette, - Neutral: TonalPalette, - NeutralVariant: TonalPalette, - Error: TonalPalette, - }, - CustomColors: { + _Schemes: {[Enums.SchemeType]: Scheme}, + Palettes: {[Enums.PaletteType]: TonalPalette}, + _CustomColors: { [string]: CustomColorGroup }, + Get: ( + self: Theme, + role: Enums.ColorContextType | string, + context: Enums.ColorContextType, + schemeType: Enums.SchemeType, + elevation: number + ) -> Color3, + getElevatedColor: ( + color: Color3, + elevation: number, + schemeType: Enums.SchemeType + ) -> Color3, + new: ( + source: Color3, + custom: {[string]: Color3}? + ) -> Theme, + } -- Constants +local ELEVATION_TINTS = {0.05, 0.08, 0.11, 0.12, 0.14} -- Variables -- References -- Private Functions -function toHCT(color: Color3): GoogleHCT - local function rgbToXyz(r: number, g: number, b: number): (number, number, number) - -- Assuming sRGB color space and using a common conversion formula - r = (r > 0.04045) and ((r + 0.055) / 1.055) ^ 2.4 or r / 12.92 - g = (g > 0.04045) and ((g + 0.055) / 1.055) ^ 2.4 or g / 12.92 - b = (b > 0.04045) and ((b + 0.055) / 1.055) ^ 2.4 or b / 12.92 - - -- Convert to XYZ using the RGB to XYZ matrix for sRGB - local x = r * 0.4124564 + g * 0.3575761 + b * 0.1804375 - local y = r * 0.2126729 + g * 0.7151522 + b * 0.0721750 - local z = r * 0.0193339 + g * 0.1191920 + b * 0.9503041 - - return x, y, z - end - - local function xyzToLab(x: number, y: number, z: number): (number, number, number) - -- Observer = 2°, Illuminant = D65 - local refX, refY, refZ = 0.95047, 1.00000, 1.08883 - x = x / refX - y = y / refY - z = z / refZ - - x = (x > 0.008856) and x ^ (1/3) or (7.787 * x) + (16 / 116) - y = (y > 0.008856) and y ^ (1/3) or (7.787 * y) + (16 / 116) - z = (z > 0.008856) and z ^ (1/3) or (7.787 * z) + (16 / 116) - - local l = (116 * y) - 16 - local a = 500 * (x - y) - local b = 200 * (y - z) - - return l, a, b - end - - local function labToHct(l: number, a: number, b: number): (number, number, number) - -- Convert LAB to HCT (Hue, Chroma, Tone) - local hue = math.deg(math.atan2(b, a)) - if hue < 0 then hue = hue + 360 end - - local chroma = math.sqrt(a^2 + b^2) - local tone = l -- In LAB, L* represents lightness which is analogous to tone - - return hue, chroma, tone - end - - return HCT.from(labToHct(xyzToLab(rgbToXyz(color.R, color.G, color.B)))) -end - -function toColor3(hct: GoogleHCT): Color3 - local function hctToLab(hue: number, chroma: number, tone: number): (number, number, number) - -- Convert HCT back to LAB - local a = chroma * math.cos(math.rad(hue)) - local b = chroma * math.sin(math.rad(hue)) - local l = tone -- In LAB, L* represents lightness which is analogous to tone - return l, a, b - end - - local function labToXyz(l: number, a: number, b: number): (number, number, number) - local y = (l + 16) / 116 - local x = a / 500 + y - local z = y - b / 200 - - -- Observer= 2°, Illuminant= D65 - local refX, refY, refZ = 0.95047, 1.00000, 1.08883 - x = (x ^ 3 > 0.008856) and x ^ 3 or (x - 16 / 116) / 7.787 - y = (y ^ 3 > 0.008856) and y ^ 3 or (y - 16 / 116) / 7.787 - z = (z ^ 3 > 0.008856) and z ^ 3 or (z - 16 / 116) / 7.787 - - x = refX * x - y = refY * y - z = refZ * z - - return x, y, z - end - - local function xyzToRgb(x: number, y: number, z: number): (number, number, number) - -- Convert XYZ to RGB - local r = x * 3.2406 + y * -1.5372 + z * -0.4986 - local g = x * -0.9689 + y * 1.8758 + z * 0.0415 - local b = x * 0.0557 + y * -0.2040 + z * 1.0570 - - r = (r > 0.0031308) and 1.055 * (r ^ (1 / 2.4)) - 0.055 or 12.92 * r - g = (g > 0.0031308) and 1.055 * (g ^ (1 / 2.4)) - 0.055 or 12.92 * g - b = (b > 0.0031308) and 1.055 * (b ^ (1 / 2.4)) - 0.055 or 12.92 * b - - -- Clamp the values to the 0-1 range - r = math.max(0, math.min(1, r)) - g = math.max(0, math.min(1, g)) - b = math.max(0, math.min(1, b)) - - return r, g, b - end - return Color3.new(xyzToRgb(labToXyz(hctToLab(hct:getHue(), hct:getChroma(), hct:getTone())))) -end -- Class -local Theme = {} +local Theme = {} :: Theme +Theme.__index = Theme function Theme.new( source: Color3, - custom: {[string]: Color3}, - blend: {[string]: boolean}? + custom: {[string]: Color3}? ): Theme + local googleTheme: GoogleTheme do local customColors: {[number]: GoogleCustomColor} = {} - for k, color in pairs(custom) do - table.insert(customColors, ThemeUtil.customColor( - toHCT(source):toInt(), - k, - if blend and blend[k] ~= nil then blend[k] else false - )) + if custom then + for k, color in pairs(custom) do + table.insert(customColors, ThemeUtil.customColor( + HCT.fromColor3(source):toInt(), + k, + false + )) + end end googleTheme = ThemeUtil.themeFromSourceColor( - toHCT(source):toInt(), + HCT.fromColor3(source):toInt(), customColors ) @@ -206,36 +92,63 @@ function Theme.new( do local function fromScheme(scheme: GoogleScheme): Scheme return { - Primary = toColor3(HCT.fromInt(scheme.primary)), - OnPrimary = toColor3(HCT.fromInt(scheme.onPrimary)), - PrimaryContainer = toColor3(HCT.fromInt(scheme.primary)), - OnPrimaryContainer = toColor3(HCT.fromInt(scheme.onPrimaryContainer)), - Secondary = toColor3(HCT.fromInt(scheme.secondary)), - OnSecondary = toColor3(HCT.fromInt(scheme.onSecondary)), - SecondaryContainer = toColor3(HCT.fromInt(scheme.secondaryContainer)), - OnSecondaryContainer = toColor3(HCT.fromInt(scheme.onSecondaryContainer)), - Tertiary = toColor3(HCT.fromInt(scheme.tertiary)), - OnTertiary = toColor3(HCT.fromInt(scheme.onTertiary)), - TertiaryContainer = toColor3(HCT.fromInt(scheme.tertiaryContainer)), - OnTertiaryContainer = toColor3(HCT.fromInt(scheme.onTertiaryContainer)), - Error = toColor3(HCT.fromInt(scheme.error)), - OnError = toColor3(HCT.fromInt(scheme.onError)), - ErrorContainer = toColor3(HCT.fromInt(scheme.errorContainer)), - OnErrorContainer = toColor3(HCT.fromInt(scheme.onErrorContainer)), - Background = toColor3(HCT.fromInt(scheme.background)), - OnBackground = toColor3(HCT.fromInt(scheme.onBackground)), - Surface = toColor3(HCT.fromInt(scheme.surface)), - OnSurface = toColor3(HCT.fromInt(scheme.onSurface)), - SurfaceVariant = toColor3(HCT.fromInt(scheme.surfaceVariant)), - OnSurfaceVariant = toColor3(HCT.fromInt(scheme.onSurfaceVariant)), - Outline = toColor3(HCT.fromInt(scheme.outline)), - OutlineVariant = toColor3(HCT.fromInt(scheme.outlineVariant)), - Shadow = toColor3(HCT.fromInt(scheme.shadow)), - Scrim = toColor3(HCT.fromInt(scheme.scrim)), - InverseSurface = toColor3(HCT.fromInt(scheme.inverseSurface)), - InverseOnSurface = toColor3(HCT.fromInt(scheme.inverseOnSurface)), - InversePrimary = toColor3(HCT.fromInt(scheme.inversePrimary)), - } + Primary = { + Default = HCT.fromInt(scheme.primary):toColor3(), + OnPrimary = HCT.fromInt(scheme.onPrimary):toColor3(), + PrimaryContainer = HCT.fromInt(scheme.primaryContainer):toColor3(), + OnPrimaryContainer = HCT.fromInt(scheme.onPrimaryContainer):toColor3(), + }, + Secondary = { + Default = HCT.fromInt(scheme.secondary):toColor3(), + OnSecondary = HCT.fromInt(scheme.onSecondary):toColor3(), + SecondaryContainer = HCT.fromInt(scheme.secondaryContainer):toColor3(), + OnSecondaryContainer = HCT.fromInt(scheme.onSecondaryContainer):toColor3(), + }, + + Tertiary = { + Default = HCT.fromInt(scheme.tertiary):toColor3(), + OnTertiary = HCT.fromInt(scheme.onTertiary):toColor3(), + TertiaryContainer = HCT.fromInt(scheme.tertiaryContainer):toColor3(), + OnTertiaryContainer = HCT.fromInt(scheme.onTertiaryContainer):toColor3(), + }, + Error = { + Default = HCT.fromInt(scheme.error):toColor3(), + OnError = HCT.fromInt(scheme.onError):toColor3(), + ErrorContainer = HCT.fromInt(scheme.errorContainer):toColor3(), + OnErrorContainer = HCT.fromInt(scheme.onErrorContainer):toColor3(), + }, + Background = { + Default = HCT.fromInt(scheme.background):toColor3(), + OnBackground = HCT.fromInt(scheme.onBackground):toColor3(), + }, + Surface = { + Default = HCT.fromInt(scheme.surface):toColor3(), + OnSurface = HCT.fromInt(scheme.onSurface):toColor3(), + SurfaceVariant = HCT.fromInt(scheme.surfaceVariant):toColor3(), + OnSurfaceVariant = HCT.fromInt(scheme.onSurfaceVariant):toColor3(), + InverseSurface = HCT.fromInt(scheme.inverseSurface):toColor3(), + InverseOnSurface = HCT.fromInt(scheme.inverseOnSurface):toColor3(), + InversePrimary = HCT.fromInt(scheme.inversePrimary):toColor3(), + SurfaceDim = HCT.fromInt(scheme.surfaceDim):toColor3(), + SurfaceBright = HCT.fromInt(scheme.surfaceBright):toColor3(), + SurfaceContainerLowest = HCT.fromInt(scheme.surfaceContainerLowest):toColor3(), + SurfaceContainerLow = HCT.fromInt(scheme.surfaceContainerLow):toColor3(), + SurfaceContainer = HCT.fromInt(scheme.surfaceContainer):toColor3(), + SurfaceContainerHigh = HCT.fromInt(scheme.surfaceContainerHigh):toColor3(), + SurfaceContainerHighest = HCT.fromInt(scheme.surfaceContainerHighest):toColor3(), + SurfaceTint = HCT.fromInt(scheme.surfaceTint):toColor3(), + }, + Outline = { + Default = HCT.fromInt(scheme.outline):toColor3(), + OutlineVariant = HCT.fromInt(scheme.outlineVariant):toColor3(), + }, + Shadow = { + Default = HCT.fromInt(scheme.shadow):toColor3(), + }, + Scrim = { + Default = HCT.fromInt(scheme.scrim):toColor3(), + }, + } :: Scheme end lightScheme = fromScheme(googleTheme.schemes.light) darkScheme = fromScheme(googleTheme.schemes.dark) @@ -249,11 +162,21 @@ function Theme.new( local errorPalette: TonalPalette do local function fromPalette(tonalPalette: GoogleTonalPalette): TonalPalette - local out: {[number]: Color3} = {} - for k, v in pairs(tonalPalette.cache) do - out[k] = toColor3(HCT.fromInt(v)) + -- local out: {[number]: ColorSequenceKeypoint} = {} + -- for i=50, 900, 50 do + -- table.insert( + -- out, + -- ColorSequenceKeypoint.new( + -- (i-50)/(900-50), + -- toColor3(HCT.fromInt()) + -- ) + -- ) + -- end + + return function(alpha: number, noClamp: boolean?): Color3 + + return HCT.fromInt(tonalPalette:getTone(if noClamp then alpha*100 else math.clamp(alpha, 0.05, 0.9)*100)):toColor3() end - return out end primaryPalette = fromPalette(googleTheme.palettes.primary) secondaryPalette = fromPalette(googleTheme.palettes.secondary) @@ -265,12 +188,12 @@ function Theme.new( local customColors: {[string]: CustomColorGroup} = {} do - local function fromColorGroup(group: GoogleColorGroup): ColorGroup + local function fromColorGroup(group: GoogleColorGroup): {[Enums.ColorContextType]: Color3} return { - Color = toColor3(HCT.fromInt(group.color)), - OnColor = toColor3(HCT.fromInt(group.onColor)), - ColorContainer = toColor3(HCT.fromInt(group.colorContainer)), - OnColorContainer = toColor3(HCT.fromInt(group.onColorContainer)), + [Enums.ColorContextType.Default] = HCT.fromInt(group.color):toColor3(), + [Enums.ColorContextType.On] = HCT.fromInt(group.onColor):toColor3(), + [Enums.ColorContextType.Container] = HCT.fromInt(group.colorContainer):toColor3(), + [Enums.ColorContextType.OnContainer] = HCT.fromInt(group.onColorContainer):toColor3(), } end for i, colorGroup in pairs(googleTheme.customColors) do @@ -278,15 +201,17 @@ function Theme.new( Name = colorGroup.color.name, Value = colorGroup.value, IsBlended = colorGroup.color.blend, - Light = fromColorGroup(colorGroup.light), - Dark = fromColorGroup(colorGroup.dark), + Schemes = { + Light = fromColorGroup(colorGroup.light), + Dark = fromColorGroup(colorGroup.dark), + }, } end end - local theme: Theme = { + local theme: Theme = setmetatable({ Source = source, - Schemes = { + _Schemes = { Light = lightScheme, Dark = darkScheme }, @@ -299,9 +224,73 @@ function Theme.new( Error = errorPalette, }, CustomColors = customColors, - } + }, Theme) :: any return theme end +function Theme.getElevatedColor( + color: Color3, + elevation: number, + schemeType: Enums.SchemeType +): Color3 + local hct = HCT.fromColor3(color) + local tone = hct:getTone() + elevation = math.clamp(elevation, 1, #ELEVATION_TINTS) + + if ELEVATION_TINTS[elevation] then + local newColor = HCT.fromColor3(color) + newColor:setTone(((1-tone) * ELEVATION_TINTS[elevation])) + return newColor:toColor3() + else + local up = math.ceil(elevation) + local down = math.floor(elevation) + + local downColor = HCT.fromColor3(color) + downColor:setTone(((1-tone) * ELEVATION_TINTS[down])) + + local upColor = HCT.fromColor3(color) + upColor:setTone(((1+tone) * ELEVATION_TINTS[up])) + + return HCT.fromInt(Blend.cam16Ucs( + downColor:toInt(), + upColor:toInt(), + (elevation - down) + )):toColor3() + end +end + +function Theme:Get( + role: Enums.ColorRoleType | string, + context: Enums.ColorContextType, + schemeType: Enums.SchemeType, + elevation: number +): Color3 + + local scheme: Scheme = self._Schemes[schemeType] + + local color: Color3 + if scheme[role :: Enums.ColorRoleType] then + local contexts = scheme[role :: Enums.ColorRoleType] + if contexts[context] then + color = contexts[context] + else + error(`no color with context {context} under {role}`) + end + else + local colorGroup: CustomColorGroup = self._CustomColors[role] + if colorGroup then + local subGroup = colorGroup.Schemes[schemeType] + color = subGroup[context] + if not color then + error(`no color with context {context} under custom {role}`) + end + else + error(`no role named {role}`) + end + end + + return self.getElevatedColor(color, elevation, schemeType) +end + return Theme \ No newline at end of file diff --git a/src/Types.luau b/src/Types.luau index c6da04f1..7263d948 100644 --- a/src/Types.luau +++ b/src/Types.luau @@ -3,17 +3,25 @@ -- Packages -- Modules -- Types -export type Style = { +export type AppearanceData = { + Color3: Color3, + Transparency: number, +} + +export type ShadowData = { + Offset: Vector2, + Appearance: AppearanceData, +} + +export type RenderData = { Scale: number, - Font: Font, - TextColor3: Color3, - TextTransparency: number, - BorderColor3: Color3, - BorderTransparency: number, - BackgroundColor3: Color3, - BackgroundTransparency: number, - SoundId: string, - SoundVolume: number, + Border: AppearanceData, + Background: AppearanceData, + Sound: SoundData?, + Image: ImageData?, + Font: FontData?, + Text: AppearanceData?, + Shadow: ShadowData? } export type ImageData = { @@ -22,6 +30,11 @@ export type ImageData = { ImageRectSize: Vector2, } +export type SoundData = { + SoundId: string, + Volume: number, +} + export type ButtonData = { Icon: ImageData?, Text: string?, @@ -38,6 +51,14 @@ export type OptionData = { SelectedIcon: ImageData?, OnSelect: (isSelected: boolean) -> (), } + +export type FontData = { + Font: Font, + Size: number, + Tracking: number, + LineHeight: number, +} + -- Constants -- Variables -- References @@ -45,6 +66,20 @@ export type OptionData = { -- Class local Types = {} +function Types.newFontData( + font: Font, + size: number, + lineHeight: number?, + tracking: number? +): FontData + return { + Font = font, + Size = size, + Tracking = tracking or 0, + LineHeight = lineHeight or size, + } +end + function Types.newButtonData( onClick: () -> (), icon: ImageData?, @@ -78,6 +113,29 @@ function Types.newOptionData( OnSelect = onSelect, } end +function Types.newSoundData(soundId: string, volume: number?): SoundData + return { + SoundId = soundId, + Volume = volume or 1 + } +end + +function Types.newShadow( + appearance: AppearanceData, + offset: Vector2 +): ShadowData + return { + Appearance = appearance, + Offset = offset + } +end + +function Types.newAppearanceData(color3: Color3, transparency: number?): AppearanceData + return { + Color3 = color3, + Transparency = transparency or 0, + } +end function Types.newImageData(image: string, rectOffset: Vector2?, rectSize: Vector2?): ImageData return { @@ -87,29 +145,23 @@ function Types.newImageData(image: string, rectOffset: Vector2?, rectSize: Vecto } end -function Types.newStyle( - scale: number?, - font: Font?, - textColor3: Color3?, - textTransparency: number?, - borderColor3: Color3?, - borderTransparency: number?, - backgroundColor3: Color3?, - backgroundTransparency: number?, - soundId: string?, - soundVolume: number? -): Style +function Types.newRenderData( + scale: number, + border: AppearanceData, + background: AppearanceData, + text: AppearanceData?, + font: FontData?, + image: ImageData?, + sound: SoundData? +): RenderData return { - Scale = scale or 1, - Font = font or Font.fromEnum(Enum.Font.SourceSans), - TextColor3 = textColor3 or Color3.new(0.15,0.15,0.15), - TextTransparency = textTransparency or 0, - BorderColor3 = borderColor3 or Color3.new(0.15,0.15,0.15), - BorderTransparency = borderTransparency or 0, - BackgroundColor3 = backgroundColor3 or Color3.new(0.85,0.85,0.85), - BackgroundTransparency = backgroundTransparency or 0, - SoundId = soundId or "", - SoundVolume = soundVolume or 0, + Scale = scale, + Border = border, + Background = background, + Sound = sound, + Image = image, + Font = font, + Text = text, } end diff --git a/src/Typography.luau b/src/Typography.luau new file mode 100644 index 00000000..e1f1d2a0 --- /dev/null +++ b/src/Typography.luau @@ -0,0 +1,205 @@ +--!strict +local _Package = script.Parent +local _Packages = _Package.Parent +-- Services +-- Packages +-- Modules +local Enums = require(_Package:WaitForChild("Enums")) +local Types = require(_Package:WaitForChild("Types")) + +-- Types +-- Constants +local DEFAULT_FONT_FAMILY = "Roboto" +local WEIGHT = { + [100] = Enum.FontWeight.Thin, + [200] = Enum.FontWeight.ExtraLight, + [300] = Enum.FontWeight.Light, + [400] = Enum.FontWeight.Regular, + [500] = Enum.FontWeight.Medium, + [600] = Enum.FontWeight.SemiBold, + [700] = Enum.FontWeight.Bold, + [800] = Enum.FontWeight.ExtraBold, + [900] = Enum.FontWeight.Heavy, +} +-- Variables +-- References +-- Private Functions +-- Class +-- Types +export type FontData = Types.FontData +export type Typography = { + __index: Typography, + _Styles: { [Enums.FontType]: FontData }, + Get: (self: Typography, style: Enums.FontType) -> FontData, + new: (fontFamily: string?) -> Typography, +} + +-- Class +local Typography = {} :: Typography +Typography.__index = Typography + +function Typography:Get(style: Enums.FontType): FontData + return self._Styles[style] +end + +function Typography.new(fontFamily: string?) + fontFamily = fontFamily or DEFAULT_FONT_FAMILY + assert(fontFamily) + local self: Typography = setmetatable({}, Typography) :: any + self._Styles = { + [Enums.FontType.DisplayLarge] = { + Font = Font.new( + fontFamily, + WEIGHT[400], + Enum.FontStyle.Normal + ), + Size = 57, + Tracking = -0.25, + LineHeight = 64, + }, + [Enums.FontType.DisplayMedium] = { + Font = Font.new( + fontFamily, + WEIGHT[400], + Enum.FontStyle.Normal + ), + Size = 45, + Tracking = 0, + LineHeight = 52, + }, + [Enums.FontType.DisplaySmall] = { + Font = Font.new( + fontFamily, + WEIGHT[400], + Enum.FontStyle.Normal + ), + Size = 36, + Tracking = 0, + LineHeight = 44, + }, + [Enums.FontType.HeadlineLarge] = { + Font = Font.new( + fontFamily, + WEIGHT[400], + Enum.FontStyle.Normal + ), + Size = 32, + Tracking = 0, + LineHeight = 40, + }, + [Enums.FontType.HeadlineMedium] = { + Font = Font.new( + fontFamily, + WEIGHT[400], + Enum.FontStyle.Normal + ), + Size = 28, + Tracking = 0, + LineHeight = 36, + }, + [Enums.FontType.HeadlineSmall] = { + Font = Font.new( + fontFamily, + WEIGHT[400], + Enum.FontStyle.Normal + ), + Size = 24, + Tracking = 0, + LineHeight = 32, + }, + [Enums.FontType.TitleLarge] = { + Font = Font.new( + fontFamily, + WEIGHT[400], + Enum.FontStyle.Normal + ), + Size = 22, + Tracking = 0, + LineHeight = 28, + }, + [Enums.FontType.TitleMedium] = { + Font = Font.new( + fontFamily, + WEIGHT[500], + Enum.FontStyle.Normal + ), + Size = 16, + Tracking = 0.15, + LineHeight = 24, + }, + [Enums.FontType.TitleSmall] = { + Font = Font.new( + fontFamily, + WEIGHT[500], + Enum.FontStyle.Normal + ), + Size = 14, + Tracking = 0.1, + LineHeight = 20, + }, + [Enums.FontType.BodyLarge] = { + Font = Font.new( + fontFamily, + WEIGHT[400], + Enum.FontStyle.Normal + ), + Size = 16, + Tracking = 0.5, + LineHeight = 24, + }, + [Enums.FontType.BodyMedium] = { + Font = Font.new( + fontFamily, + WEIGHT[400], + Enum.FontStyle.Normal + ), + Size = 14, + Tracking = 0.25, + LineHeight = 20, + }, + [Enums.FontType.BodySmall] = { + Font = Font.new( + fontFamily, + WEIGHT[400], + Enum.FontStyle.Normal + ), + Size = 12, + Tracking = 0.4, + LineHeight = 16, + }, + [Enums.FontType.LabelLarge] = { + Font = Font.new( + fontFamily, + WEIGHT[500], + Enum.FontStyle.Normal + ), + Size = 14, + Tracking = 0.1, + LineHeight = 20, + }, + [Enums.FontType.LabelMedium] = { + Font = Font.new( + fontFamily, + WEIGHT[700], + Enum.FontStyle.Normal + ), + Size = 12, + Tracking = 0.5, + LineHeight = 16, + }, + [Enums.FontType.LabelSmall] = { + Font = Font.new( + fontFamily, + WEIGHT[500], + Enum.FontStyle.Normal + ), + Size = 11, + Tracking = 0.5, + LineHeight = 16, + }, + } + + return self +end + +return Typography diff --git a/src/Util.luau b/src/Util.luau deleted file mode 100644 index e0a9e7a9..00000000 --- a/src/Util.luau +++ /dev/null @@ -1,154 +0,0 @@ ---!strict -local _Package = script.Parent -local _Packages = _Package.Parent --- Services --- Packages -local CurveUtil = require(_Packages:WaitForChild("CurveUtil")) --- Modules --- Types --- Constants -local LUM_LIMIT = 0.03928 -local LUM_DENOM = 12.92 -local LUM_OFFSET = 0.055 -local LUM_OFFSET_DENOM = 1.055 -local R_WEIGHT = 0.2126 -local G_WEIGHT = 0.7152 -local B_WEIGHT = 0.0722 -local L_EXP = 2.4 -local MIN_HEX_DIFFERENCE = 100 / 255 -local DEFAULT_CONTRAST_RATIO = 4.5 -local BLACK_COLOR = Color3.new(0, 0, 0) -local WHITE_COLOR = Color3.new(1, 1, 1) -local MAX_ELEVATION = 8 --- Variables --- References --- Private Functions - -function getContrastRatio(textColor3: Color3, backgroundColor3: Color3): number - local function getRelativeLuminance(color: Color3): number - local function solveSpace(v: number): number - if v < LUM_LIMIT then - return v / LUM_DENOM - else - return ((v + LUM_OFFSET) / LUM_OFFSET_DENOM) ^ L_EXP - end - end - return R_WEIGHT * solveSpace(color.R) + G_WEIGHT * solveSpace(color.G) + B_WEIGHT * solveSpace(color.B) - end - - local _fH, _fS, fV = textColor3:ToHSV() - local _bH, _bS, bV = backgroundColor3:ToHSV() - - local fLum = getRelativeLuminance(textColor3) - local bLum = getRelativeLuminance(backgroundColor3) - - local lighterRelativeLuminance: number - local darkerRelativeLuminance: number - if fV < bV then - lighterRelativeLuminance = bLum - darkerRelativeLuminance = fLum - else - lighterRelativeLuminance = fLum - darkerRelativeLuminance = bLum - end - - return (lighterRelativeLuminance + 0.05) / (darkerRelativeLuminance + 0.05) -end - --- Class -local Util = {} - -Util.DARK_SURFACE = Color3.new(0.15, 0.15, 0.15) -Util.LIGHT_SURFACE = Color3.new(0.85, 0.85, 0.85) - -function Util.getIfReadable(textColor3: Color3, backgroundColor3: Color3, minConstrastRatio: number?): boolean - minConstrastRatio = minConstrastRatio or DEFAULT_CONTRAST_RATIO - assert(minConstrastRatio) - local ratio = getContrastRatio(textColor3, backgroundColor3) - return ratio >= minConstrastRatio -end - --- https://github.com/alex-page/a11ycolor/blob/main/index.js -function Util.getReadableColor( - textColor3: Color3, - backgroundColor3: Color3, - minConstrastRatio: number? -): Color3 - minConstrastRatio = minConstrastRatio or DEFAULT_CONTRAST_RATIO - assert(minConstrastRatio) - - -- Check the ratio straight away, if it passes return the value as hex - if Util.getIfReadable(textColor3, backgroundColor3, minConstrastRatio) then - return textColor3 - end - - -- Ratio didn't pass so we need to find the nearest color - local isBlackContrast = Util.getIfReadable(BLACK_COLOR, backgroundColor3, minConstrastRatio) - local isWhiteContrast = Util.getIfReadable(WHITE_COLOR, backgroundColor3, minConstrastRatio) - - local cH, cS, cV = textColor3:ToHSV() - local minValue = 0 - local maxValue = 1 - local isDarkColor = false - - -- If black and white both pass on the background - if isBlackContrast and isWhiteContrast then - -- Change the min lightness if the color is light - if cV >= 0.5 then - minValue = cV - else -- Change the max lightness if the color is dark - maxValue = cV - isDarkColor = true - end - elseif isBlackContrast then -- If our colour passes contrast on black - maxValue = cV - isDarkColor = true - else -- Colour doesn't meet contrast pass on black - minValue = cV - end - - -- The color to return - local finalColor: Color3? - - -- Binary search until we find the colour that meets contrast - local prevColor: Color3? - while not finalColor do - local midValue = (minValue + maxValue) / 2 - local midColor = Color3.fromHSV(cH, cS, midValue) - - if Util.getIfReadable(midColor, backgroundColor3, minConstrastRatio) then - if maxValue - minValue <= MIN_HEX_DIFFERENCE then - finalColor = midColor - elseif isDarkColor then - minValue = midValue - else - maxValue = midValue - end - elseif isDarkColor then - maxValue = midValue - else - minValue = midValue - end - - if prevColor == midColor then - break - end - - prevColor = midColor - end - - return finalColor or textColor3 -end - -function Util.getElevatedColor(color: Color3, elevation: number, isDarkMode: boolean): Color3 - elevation = math.clamp(elevation, 0, MAX_ELEVATION) - local alpha = CurveUtil.ease(elevation / MAX_ELEVATION, Enum.EasingStyle.Quad, Enum.EasingDirection.In) - - if isDarkMode then - return CurveUtil.lerp(color, Color3.new(1, 1, 1), alpha*0.75) - else - return CurveUtil.lerp(color, Color3.new(1, 1, 1), alpha*0.95) - end -end - -return Util diff --git a/src/init.luau b/src/init.luau index b871b2cd..572161e1 100644 --- a/src/init.luau +++ b/src/init.luau @@ -5,13 +5,15 @@ local _Packages = _Package.Parent -- Services -- Packages -- Modules -local Util = require(ReplicatedStorage.Packages.synthetic.Util) local Types = require(_Package:WaitForChild("Types")) +local Theme = require(_Package:WaitForChild("Theme")) +local Typography = require(_Package:WaitForChild("Typography")) -- Types export type ImageData = Types.ImageData -export type Style = Types.Style export type OptionData = Types.OptionData +export type Theme = Theme.Theme +export type Typography = Typography.Typography -- Constants -- Variables -- References @@ -23,7 +25,8 @@ local Synthetic = {} Synthetic.Enums = require(_Package:WaitForChild("Enums")) Synthetic.Sounds = require(_Package:WaitForChild("Sounds")) Synthetic.Types = Types -Synthetic.Util = require(_Package:WaitForChild("Util")) +Synthetic.Typography = Typography +Synthetic.Themes = Theme Synthetic.Components = { Bar = { Bottom = require(Component:WaitForChild("Bar"):WaitForChild("Bottom")), From 4b1dd14aea09db66cef5754879f2e7f83285e51a Mon Sep 17 00:00:00 2001 From: Nightcycle <77173389+nightcycle@users.noreply.github.com> Date: Sat, 9 Dec 2023 16:21:06 -0500 Subject: [PATCH 22/57] Re-implemented the text button with the new UI --- pseudo-enum.toml | 55 ++++-- src/Component/Button/Base.luau | 31 ++- .../Button/TextButton/cfusion.story.luau | 77 +++++--- src/Component/Button/TextButton/init.luau | 180 ++++++++++++----- src/Enums.luau | 156 ++++++++++----- src/Style.luau | 47 ++++- src/StyleUtil.luau | 115 ++--------- src/Theme/Scheme.story.luau | 68 ++++--- src/Theme/Scheme/init.luau | 1 - src/Theme/init.luau | 187 ++++++++---------- src/Types.luau | 4 +- synthetic.rbxl.lock | 2 +- 12 files changed, 516 insertions(+), 407 deletions(-) diff --git a/pseudo-enum.toml b/pseudo-enum.toml index b0cddaa0..cfdd8469 100644 --- a/pseudo-enum.toml +++ b/pseudo-enum.toml @@ -22,36 +22,51 @@ FontType = [ ] ButtonStateType = ["Enabled", "Disabled", "Hovered", "Focused", "Pressed"] SchemeType = ["Light", "Dark"] +CustomColorType = [ + "Custom", + "OnCustom", + "CustomContainer", + "OnCustomContainer" +] ColorRoleType = [ "Primary", + "OnPrimary", + "PrimaryContainer", + "OnPrimaryContainer", "Secondary", + "OnSecondary", + "SecondaryContainer", + "OnSecondaryContainer", "Tertiary", + "OnTertiary", + "TertiaryContainer", + "OnTertiaryContainer", "Error", + "OnError", + "ErrorContainer", + "OnErrorContainer", "Background", + "OnBackground", "Surface", + "OnSurface", + "SurfaceVariant", + "OnSurfaceVariant", "Outline", + "OutlineVariant", "Shadow", - "Scrim" -] -ColorContextType = [ - "Default", - "On", - "Container", - "OnContainer", - "Surface", - "Dim", - "Bright", - "Lowest", - "Low", - "High", - "Highest", - "Tint", - "Variant", - "OnVariant", - "Inverse", - "InverseOn", + "Scrim", + "InverseSurface", + "InverseOnSurface", + "InversePrimary", + "SurfaceDim", + "SurfaceBright", + "SurfaceContainerLowest", + "SurfaceContainerLow", + "SurfaceContainer", + "SurfaceContainerHigh", + "SurfaceContainerHighest", + "SurfaceTint", ] - PaletteType = [ "Primary", "Secondary", diff --git a/src/Component/Button/Base.luau b/src/Component/Button/Base.luau index eca85c1c..eae3bec6 100644 --- a/src/Component/Button/Base.luau +++ b/src/Component/Button/Base.luau @@ -13,8 +13,6 @@ local CurveUtil = require(_Packages:WaitForChild("CurveUtil")) -- Modules local Enums = require(_Package:WaitForChild("Enums")) local Types = require(_Package:WaitForChild("Types")) -local Theme = require(_Package:WaitForChild("Theme")) -local StyleUtil = require(_Package:WaitForChild("StyleUtil")) -- Types type Maid = Maid.Maid type Fuse = ColdFusion.Fuse @@ -39,9 +37,6 @@ local IMAGE_SIZE = 500 local RIP_STEP = 0.005 local HALF_IMAGE_SIZE = IMAGE_SIZE / 2 -local sAssert = StyleUtil.assert -local isNil = StyleUtil.isNil -local flip = StyleUtil.inverse local Util = {} @@ -101,6 +96,7 @@ Util.component = function( ) :: State local renderDatasState = _import(renderDatas, {}) :: any + local currentRenderDataState = _Computed( function(state: Enums.ButtonStateType, renderDatas: { [Enums.ButtonStateType]: RenderData }): RenderData local renderData = renderDatas[state] @@ -143,10 +139,11 @@ Util.component = function( local cornerRadiusState = _import(cornerRadius, SHAPE_DP) local paddingScaleState = _import(paddingScale, 1) local useRippleState = _import(useRipple, false) - local currentTextRenderData: State = sAssert( - fuse, - StyleUtil.getTextAppearanceData(fuse, currentRenderDataState) :: any - ) + local currentTextRenderData: State = _Computed(function(rData: RenderData): AppearanceData + local tData = rData.Text + assert(tData, `bad text data`) + return tData + end, currentRenderDataState) local inst: Frame @@ -202,9 +199,9 @@ Util.component = function( maid._ripple = runMaid end - local shadowSizeState = _Computed(function(s: number, isDrop: boolean): UDim - return if isDrop then UDim.new(0, s * 5) else UDim.new(0, 0) - end, scaleState, isDropShadowState) + local shadowSizeState = _Computed(function(s: number, renderData: RenderData): UDim + return if renderData and renderData.Shadow then UDim.new(renderData.Shadow.Offset.X * 5, renderData.Shadow.Offset.Y * 5) else UDim.new(0, 0) + end, scaleState, currentRenderDataState) inst = _new("Frame")({ BackgroundTransparency = 1, @@ -215,11 +212,13 @@ Util.component = function( }), _new("ImageLabel")({ Image = "rbxassetid://15549395120", - ImageColor3 = Color3.new(0, 0, 0), + ImageColor3 = _Computed(function(renderData: RenderData): Color3 + return if renderData.Shadow and renderData.Shadow.Appearance then renderData.Shadow.Appearance.Color3 else Color3.new(0,0,0) + end, currentRenderDataState), BackgroundTransparency = 1, - ImageTransparency = _Computed(function(renderData: RenderData, isDrop: boolean): number - return if renderData.Text and renderData.Text.Transparency == 0 and isDrop then 0 else 1 - end, currentRenderDataState, isDropShadowState), + ImageTransparency = _Computed(function(renderData: RenderData): number + return if renderData.Shadow and renderData.Shadow.Appearance then renderData.Shadow.Appearance.Transparency else 1 + end, currentRenderDataState), ScaleType = Enum.ScaleType.Slice, AutomaticSize = Enum.AutomaticSize.XY, SliceCenter = Rect.new(HALF_IMAGE_SIZE, HALF_IMAGE_SIZE, HALF_IMAGE_SIZE, HALF_IMAGE_SIZE), diff --git a/src/Component/Button/TextButton/cfusion.story.luau b/src/Component/Button/TextButton/cfusion.story.luau index 02c5ca92..c853ec2e 100644 --- a/src/Component/Button/TextButton/cfusion.story.luau +++ b/src/Component/Button/TextButton/cfusion.story.luau @@ -8,6 +8,9 @@ local MaterialIcons = require(_Packages:WaitForChild("MaterialIcons")) -- Modules local Types = require(_Package:WaitForChild("Types")) +local Style = require(_Package:WaitForChild("Style")) +local Enums = require(_Package:WaitForChild("Enums")) + -- Types -- Constants local SCALE = 1 @@ -20,11 +23,17 @@ return function(frame: Frame) local maid = Maid.new() task.spawn(function() local function makeHalfFrame(isDarkMode: boolean, color: Color3): Frame - local halfFrame = maid:GiveTask(Instance.new("Frame")) - halfFrame.BackgroundColor3 = if isDarkMode - then Color3.new(0.15, 0.15, 0.15) - else Color3.new(0.85, 0.85, 0.85) + local style = Style.new( + 1, + "Roboto", + if isDarkMode then Enums.SchemeType.Dark else Enums.SchemeType.Light, + color + ) + + local halfFrame = maid:GiveTask(Instance.new("Frame")) + halfFrame.BackgroundColor3 = style:GetColor(Enums.ColorRoleType.Surface) + halfFrame.BorderSizePixel = 0 local listLayout = maid:GiveTask(Instance.new("UIListLayout")) listLayout.FillDirection = Enum.FillDirection.Vertical listLayout.Padding = UDim.new(0, 10) @@ -33,43 +42,59 @@ return function(frame: Frame) listLayout.Parent = halfFrame local Module = require(script.Parent) - local theme = Types.newThemeData( - 1, - isDarkMode, - SCALE, - Font.fromEnum(Enum.Font.SourceSans), - color, - halfFrame.BackgroundColor3 - ) do - local button = maid:GiveTask(Module.cfusion(function() - print("click") - end, "Button", theme, nil, nil)) + local button = maid:GiveTask( + Module.ColdFusion.new( + function() + print("click") + end, + "Button", + nil, + style, + style:GetColor(Enums.ColorRoleType.Primary), + style:GetColor(Enums.ColorRoleType.Surface), + style:GetColor(Enums.ColorRoleType.Primary), + true, + 0 + ) + ) button.Parent = halfFrame end do - local button = maid:GiveTask(Module.cfusion(function() - print("click") - end, "Disabled", theme, nil, false)) + local button = maid:GiveTask( + Module.ColdFusion.new( + function() + print("click") + end, + "Disabled", + nil, + style, + style:GetColor(Enums.ColorRoleType.Primary), + style:GetColor(Enums.ColorRoleType.Surface), + style:GetColor(Enums.ColorRoleType.Primary), + false, + 0 + ) + ) button.Parent = halfFrame end do local button = maid:GiveTask( - Module.cfusion( + Module.ColdFusion.new( function() print("click") end, "Icon", - theme, - Types.newImageData( - Icons.voice_chat.Image, - Icons.voice_chat.ImageRectOffset, - Icons.voice_chat.ImageRectSize - ), - true + Icons.waterfall_chart, + style, + style:GetColor(Enums.ColorRoleType.Primary), + style:GetColor(Enums.ColorRoleType.Surface), + style:GetColor(Enums.ColorRoleType.Primary), + true, + 0 ) ) button.Parent = halfFrame diff --git a/src/Component/Button/TextButton/init.luau b/src/Component/Button/TextButton/init.luau index c5765be4..d8254e49 100644 --- a/src/Component/Button/TextButton/init.luau +++ b/src/Component/Button/TextButton/init.luau @@ -16,6 +16,7 @@ local Base = require(script.Parent:WaitForChild("Base")) local StyleUtil = require(_Package:WaitForChild("StyleUtil")) local Typography = require(_Package:WaitForChild("Typography")) local Theme = require(_Package:WaitForChild("Theme")) +local Style = require(_Package:WaitForChild("Style")) -- Types type Maid = Maid.Maid @@ -25,14 +26,10 @@ type CanBeState = ColdFusion.CanBeState type RenderData = Types.RenderData type Typography = Typography.Typography type Theme = Theme.Theme +type Style = Style.Style +type ImageData = Types.ImageData -- Constants -local DEFAULT_VOLUME = Config.Sound.Volume -local HOVER_TRANSPARENCY = Config.Transparency.Background.Hovered -local FOCUS_TRANSPARENCY = Config.Transparency.Background.Focused -local PRESS_TRANSPARENCY = Config.Transparency.Background.Pressed -local DISABLE_TRANSPARENCY = Config.Transparency.Text.Disabled - -- Variables -- References -- Private Functions @@ -42,11 +39,16 @@ local Interface = {} Interface.ColdFusion = {} -function Interface.ColdFusion._new( +function Interface.ColdFusion.new( onClick: CanBeState<() -> ()>, text: CanBeState, + icon: CanBeState, + style: CanBeState