IWannaDieAsWell

fluenty testy

Feb 23rd, 2026
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 89.56 KB | None | 0 0
  1. --[[
  2. Fluent UI Library — Modified
  3. Original: dawid-scripts/Fluent (MIT License)
  4. Modifications: CollapsibleSection + PetPicker elements, fully integrated
  5.  
  6. Load with:
  7. local Fluent = loadstring(game:HttpGet("YOUR_URL"))()
  8.  
  9. NEW ELEMENTS:
  10. Tab:AddCollapsibleSection(name) → collapsible group with ▶/▼ toggle
  11. Tab/Section:AddPetPicker(id, options) → search + rarity multi-picker
  12. ]]
  13.  
  14. -- ─── Executor Compat ──────────────────────────────────────────────────────────
  15. local cloneref = cloneref or function(x) return x end
  16. local gethui = gethui or function() return game:GetService("CoreGui") end
  17.  
  18. -- ─── Services ─────────────────────────────────────────────────────────────────
  19. local TweenService = cloneref(game:GetService("TweenService"))
  20. local UserInputService = cloneref(game:GetService("UserInputService"))
  21. local RunService = cloneref(game:GetService("RunService"))
  22. local Players = cloneref(game:GetService("Players"))
  23. local CoreGui = cloneref(game:GetService("CoreGui"))
  24. local LocalPlayer = Players.LocalPlayer
  25.  
  26. -- ─── Library ──────────────────────────────────────────────────────────────────
  27. local Fluent = {}
  28. Fluent.Version = "1.1.0-modified"
  29. Fluent.Options = {}
  30. Fluent.Modules = {}
  31.  
  32. -- ─── Themes ───────────────────────────────────────────────────────────────────
  33. Fluent.Themes = {
  34. Dark = {
  35. Background = Color3.fromRGB(25, 25, 25),
  36. Second = Color3.fromRGB(30, 30, 30),
  37. Third = Color3.fromRGB(38, 38, 38),
  38. Accent = Color3.fromRGB(103, 137, 240),
  39. AccentDark = Color3.fromRGB(82, 116, 219),
  40. Text = Color3.fromRGB(240, 240, 240),
  41. SubText = Color3.fromRGB(135, 135, 135),
  42. DarkText = Color3.fromRGB(90, 90, 90),
  43. ButtonBg = Color3.fromRGB(40, 40, 40),
  44. ElementBg = Color3.fromRGB(35, 35, 35),
  45. ElementBgHover = Color3.fromRGB(43, 43, 43),
  46. ElementStroke = Color3.fromRGB(50, 50, 50),
  47. WindowStroke = Color3.fromRGB(48, 48, 48),
  48. TabBg = Color3.fromRGB(20, 20, 20),
  49. TabButtonBg = Color3.fromRGB(27, 27, 27),
  50. TabButtonHover = Color3.fromRGB(35, 35, 35),
  51. TabButtonActive = Color3.fromRGB(38, 38, 38),
  52. SectionBg = Color3.fromRGB(28, 28, 28),
  53. SectionHeader = Color3.fromRGB(34, 34, 34),
  54. NotifBg = Color3.fromRGB(28, 28, 28),
  55. Toggle = Color3.fromRGB(103, 137, 240),
  56. ToggleOff = Color3.fromRGB(55, 55, 55),
  57. Error = Color3.fromRGB(235, 70, 70),
  58. Warning = Color3.fromRGB(235, 170, 70),
  59. Success = Color3.fromRGB(70, 200, 100),
  60. Info = Color3.fromRGB(103, 137, 240),
  61. },
  62. Light = {
  63. Background = Color3.fromRGB(240, 240, 240),
  64. Second = Color3.fromRGB(230, 230, 230),
  65. Third = Color3.fromRGB(220, 220, 220),
  66. Accent = Color3.fromRGB(70, 110, 220),
  67. AccentDark = Color3.fromRGB(50, 90, 200),
  68. Text = Color3.fromRGB(20, 20, 20),
  69. SubText = Color3.fromRGB(100, 100, 100),
  70. DarkText = Color3.fromRGB(140, 140, 140),
  71. ButtonBg = Color3.fromRGB(215, 215, 215),
  72. ElementBg = Color3.fromRGB(225, 225, 225),
  73. ElementBgHover = Color3.fromRGB(210, 210, 210),
  74. ElementStroke = Color3.fromRGB(195, 195, 195),
  75. WindowStroke = Color3.fromRGB(185, 185, 185),
  76. TabBg = Color3.fromRGB(232, 232, 232),
  77. TabButtonBg = Color3.fromRGB(236, 236, 236),
  78. TabButtonHover = Color3.fromRGB(220, 220, 220),
  79. TabButtonActive = Color3.fromRGB(210, 210, 210),
  80. SectionBg = Color3.fromRGB(228, 228, 228),
  81. SectionHeader = Color3.fromRGB(218, 218, 218),
  82. NotifBg = Color3.fromRGB(235, 235, 235),
  83. Toggle = Color3.fromRGB(70, 110, 220),
  84. ToggleOff = Color3.fromRGB(180, 180, 180),
  85. Error = Color3.fromRGB(200, 50, 50),
  86. Warning = Color3.fromRGB(200, 130, 30),
  87. Success = Color3.fromRGB(40, 160, 70),
  88. Info = Color3.fromRGB(70, 110, 220),
  89. },
  90. Nord = {
  91. Background = Color3.fromRGB(46, 52, 64),
  92. Second = Color3.fromRGB(59, 66, 82),
  93. Third = Color3.fromRGB(67, 76, 94),
  94. Accent = Color3.fromRGB(136, 192, 208),
  95. AccentDark = Color3.fromRGB(110, 168, 186),
  96. Text = Color3.fromRGB(236, 239, 244),
  97. SubText = Color3.fromRGB(163, 176, 196),
  98. DarkText = Color3.fromRGB(129, 145, 168),
  99. ButtonBg = Color3.fromRGB(67, 76, 94),
  100. ElementBg = Color3.fromRGB(59, 66, 82),
  101. ElementBgHover = Color3.fromRGB(67, 76, 94),
  102. ElementStroke = Color3.fromRGB(76, 86, 106),
  103. WindowStroke = Color3.fromRGB(55, 62, 78),
  104. TabBg = Color3.fromRGB(46, 52, 64),
  105. TabButtonBg = Color3.fromRGB(46, 52, 64),
  106. TabButtonHover = Color3.fromRGB(59, 66, 82),
  107. TabButtonActive = Color3.fromRGB(67, 76, 94),
  108. SectionBg = Color3.fromRGB(50, 57, 70),
  109. SectionHeader = Color3.fromRGB(59, 66, 82),
  110. NotifBg = Color3.fromRGB(59, 66, 82),
  111. Toggle = Color3.fromRGB(136, 192, 208),
  112. ToggleOff = Color3.fromRGB(76, 86, 106),
  113. Error = Color3.fromRGB(191, 97, 106),
  114. Warning = Color3.fromRGB(235, 203, 139),
  115. Success = Color3.fromRGB(163, 190, 140),
  116. Info = Color3.fromRGB(136, 192, 208),
  117. },
  118. Solarized = {
  119. Background = Color3.fromRGB(0, 43, 54),
  120. Second = Color3.fromRGB(7, 54, 66),
  121. Third = Color3.fromRGB(0, 56, 70),
  122. Accent = Color3.fromRGB(38, 139, 210),
  123. AccentDark = Color3.fromRGB(20, 115, 190),
  124. Text = Color3.fromRGB(253, 246, 227),
  125. SubText = Color3.fromRGB(147, 161, 161),
  126. DarkText = Color3.fromRGB(101, 123, 131),
  127. ButtonBg = Color3.fromRGB(0, 56, 70),
  128. ElementBg = Color3.fromRGB(7, 54, 66),
  129. ElementBgHover = Color3.fromRGB(0, 56, 70),
  130. ElementStroke = Color3.fromRGB(0, 70, 88),
  131. WindowStroke = Color3.fromRGB(0, 50, 62),
  132. TabBg = Color3.fromRGB(0, 43, 54),
  133. TabButtonBg = Color3.fromRGB(0, 43, 54),
  134. TabButtonHover = Color3.fromRGB(7, 54, 66),
  135. TabButtonActive = Color3.fromRGB(0, 56, 70),
  136. SectionBg = Color3.fromRGB(0, 50, 62),
  137. SectionHeader = Color3.fromRGB(7, 54, 66),
  138. NotifBg = Color3.fromRGB(7, 54, 66),
  139. Toggle = Color3.fromRGB(38, 139, 210),
  140. ToggleOff = Color3.fromRGB(0, 70, 88),
  141. Error = Color3.fromRGB(220, 50, 47),
  142. Warning = Color3.fromRGB(181, 137, 0),
  143. Success = Color3.fromRGB(133, 153, 0),
  144. Info = Color3.fromRGB(38, 139, 210),
  145. },
  146. Dracula = {
  147. Background = Color3.fromRGB(40, 42, 54),
  148. Second = Color3.fromRGB(50, 52, 66),
  149. Third = Color3.fromRGB(55, 57, 73),
  150. Accent = Color3.fromRGB(189, 147, 249),
  151. AccentDark = Color3.fromRGB(163, 120, 230),
  152. Text = Color3.fromRGB(248, 248, 242),
  153. SubText = Color3.fromRGB(174, 174, 174),
  154. DarkText = Color3.fromRGB(130, 130, 130),
  155. ButtonBg = Color3.fromRGB(55, 57, 73),
  156. ElementBg = Color3.fromRGB(50, 52, 66),
  157. ElementBgHover = Color3.fromRGB(60, 62, 78),
  158. ElementStroke = Color3.fromRGB(68, 71, 90),
  159. WindowStroke = Color3.fromRGB(62, 65, 83),
  160. TabBg = Color3.fromRGB(40, 42, 54),
  161. TabButtonBg = Color3.fromRGB(40, 42, 54),
  162. TabButtonHover = Color3.fromRGB(50, 52, 66),
  163. TabButtonActive = Color3.fromRGB(55, 57, 73),
  164. SectionBg = Color3.fromRGB(44, 46, 60),
  165. SectionHeader = Color3.fromRGB(52, 54, 68),
  166. NotifBg = Color3.fromRGB(50, 52, 66),
  167. Toggle = Color3.fromRGB(189, 147, 249),
  168. ToggleOff = Color3.fromRGB(68, 71, 90),
  169. Error = Color3.fromRGB(255, 85, 85),
  170. Warning = Color3.fromRGB(255, 184, 108),
  171. Success = Color3.fromRGB(80, 250, 123),
  172. Info = Color3.fromRGB(139, 233, 253),
  173. },
  174. }
  175.  
  176. local T = Fluent.Themes.Dark -- active theme reference, replaced at window creation
  177.  
  178. -- ─── Utility ──────────────────────────────────────────────────────────────────
  179. local function New(class, props, children)
  180. local inst = Instance.new(class)
  181. for k, v in pairs(props) do
  182. if k ~= "Parent" then
  183. pcall(function() inst[k] = v end)
  184. end
  185. end
  186. for _, c in ipairs(children or {}) do
  187. c.Parent = inst
  188. end
  189. if props.Parent then inst.Parent = props.Parent end
  190. return inst
  191. end
  192.  
  193. local function Tween(inst, props, t, style, dir)
  194. TweenService:Create(inst, TweenInfo.new(t or 0.15, style or Enum.EasingStyle.Quad, dir or Enum.EasingDirection.Out), props):Play()
  195. end
  196.  
  197. local function AddCorner(parent, radius)
  198. local c = Instance.new("UICorner")
  199. c.CornerRadius = UDim.new(0, radius or 8)
  200. c.Parent = parent
  201. return c
  202. end
  203.  
  204. local function AddStroke(parent, color, thickness)
  205. local s = Instance.new("UIStroke")
  206. s.Color = color or T.ElementStroke
  207. s.Thickness = thickness or 1
  208. s.Parent = parent
  209. return s
  210. end
  211.  
  212. local function AddPadding(parent, top, right, bottom, left)
  213. local p = Instance.new("UIPadding")
  214. p.PaddingTop = UDim.new(0, top or 6)
  215. p.PaddingRight = UDim.new(0, right or 6)
  216. p.PaddingBottom = UDim.new(0, bottom or 6)
  217. p.PaddingLeft = UDim.new(0, left or 6)
  218. p.Parent = parent
  219. return p
  220. end
  221.  
  222. local function AddList(parent, padding, dir)
  223. local l = Instance.new("UIListLayout")
  224. l.Padding = UDim.new(0, padding or 6)
  225. l.SortOrder = Enum.SortOrder.LayoutOrder
  226. l.FillDirection = dir or Enum.FillDirection.Vertical
  227. l.HorizontalAlignment = Enum.HorizontalAlignment.Center
  228. l.Parent = parent
  229. return l
  230. end
  231.  
  232. local function HoverEffect(btn, normal, hover)
  233. btn.MouseEnter:Connect(function() Tween(btn, {BackgroundColor3 = hover}, 0.1) end)
  234. btn.MouseLeave:Connect(function() Tween(btn, {BackgroundColor3 = normal}, 0.1) end)
  235. end
  236.  
  237. local function MakeElement(class, props)
  238. local frame = New(class, props)
  239. return frame
  240. end
  241.  
  242. -- ─── Notification Queue ────────────────────────────────────────────────────────
  243. local NotifGui = nil
  244. local NotifQueue = {}
  245.  
  246. local function BuildNotifGui()
  247. local gui = New("ScreenGui", {
  248. Name = "FluentNotifications",
  249. ResetOnSpawn = false,
  250. ZIndexBehavior = Enum.ZIndexBehavior.Sibling,
  251. Parent = gethui(),
  252. })
  253. local holder = New("Frame", {
  254. Name = "Holder",
  255. BackgroundTransparency = 1,
  256. AnchorPoint = Vector2.new(1, 1),
  257. Position = UDim2.new(1, -16, 1, -16),
  258. Size = UDim2.new(0, 310, 1, -32),
  259. Parent = gui,
  260. })
  261. local list = Instance.new("UIListLayout")
  262. list.VerticalAlignment = Enum.VerticalAlignment.Bottom
  263. list.SortOrder = Enum.SortOrder.LayoutOrder
  264. list.Padding = UDim.new(0, 8)
  265. list.Parent = holder
  266. NotifGui = holder
  267. end
  268.  
  269. function Fluent:Notify(options)
  270. if not NotifGui then BuildNotifGui() end
  271. local title = options.Title or "Notification"
  272. local content = options.Content or ""
  273. local duration = options.Duration or 5
  274. local ntype = options.Type or "Info" -- Info, Success, Warning, Error
  275.  
  276. local accentCol = T.Info
  277. if ntype == "Success" then accentCol = T.Success
  278. elseif ntype == "Warning" then accentCol = T.Warning
  279. elseif ntype == "Error" then accentCol = T.Error end
  280.  
  281. local notif = New("Frame", {
  282. BackgroundColor3 = T.NotifBg,
  283. Size = UDim2.new(1, 0, 0, 0),
  284. AutomaticSize = Enum.AutomaticSize.Y,
  285. ClipsDescendants = true,
  286. Parent = NotifGui,
  287. })
  288. AddCorner(notif, 8)
  289. AddStroke(notif, T.ElementStroke)
  290.  
  291. -- Accent bar
  292. New("Frame", {
  293. BackgroundColor3 = accentCol,
  294. Size = UDim2.new(0, 3, 1, 0),
  295. Parent = notif,
  296. })
  297.  
  298. local inner = New("Frame", {
  299. BackgroundTransparency = 1,
  300. Position = UDim2.new(0, 12, 0, 0),
  301. Size = UDim2.new(1, -16, 0, 0),
  302. AutomaticSize = Enum.AutomaticSize.Y,
  303. Parent = notif,
  304. })
  305. AddPadding(inner, 8, 0, 8, 0)
  306.  
  307. New("TextLabel", {
  308. BackgroundTransparency = 1,
  309. Size = UDim2.new(1, 0, 0, 18),
  310. Text = title,
  311. TextColor3 = T.Text,
  312. TextSize = 13,
  313. Font = Enum.Font.GothamBold,
  314. TextXAlignment = Enum.TextXAlignment.Left,
  315. Parent = inner,
  316. })
  317. New("TextLabel", {
  318. BackgroundTransparency = 1,
  319. Position = UDim2.new(0, 0, 0, 22),
  320. Size = UDim2.new(1, 0, 0, 0),
  321. AutomaticSize = Enum.AutomaticSize.Y,
  322. Text = content,
  323. TextColor3 = T.SubText,
  324. TextSize = 11,
  325. Font = Enum.Font.Gotham,
  326. TextWrapped = true,
  327. TextXAlignment = Enum.TextXAlignment.Left,
  328. Parent = inner,
  329. })
  330.  
  331. notif.BackgroundTransparency = 1
  332. Tween(notif, {BackgroundTransparency = 0}, 0.2)
  333.  
  334. task.delay(duration, function()
  335. Tween(notif, {BackgroundTransparency = 1}, 0.3)
  336. task.delay(0.32, function() notif:Destroy() end)
  337. end)
  338. end
  339.  
  340. -- ═════════════════════════════════════════════════════════════════════════════
  341. -- WINDOW
  342. -- ═════════════════════════════════════════════════════════════════════════════
  343. function Fluent:CreateWindow(options)
  344. options = options or {}
  345. local title = options.Title or "Fluent"
  346. local subtitle = options.SubTitle or ""
  347. local tabWidth = options.TabWidth or 160
  348. local size = options.Size or UDim2.fromOffset(580, 460)
  349. local acrylic = options.Acrylic ~= false
  350. local themeName = options.Theme or "Dark"
  351. local minimizeKey = options.MinimizeKey or Enum.KeyCode.RightControl
  352.  
  353. -- Set active theme
  354. T = Fluent.Themes[themeName] or Fluent.Themes.Dark
  355.  
  356. local Window = {
  357. Tabs = {},
  358. TabCount = 0,
  359. ActiveTab = nil,
  360. IsVisible = true,
  361. MinimizeKey = minimizeKey,
  362. }
  363.  
  364. -- Screen GUI
  365. local gui = New("ScreenGui", {
  366. Name = "FluentUI_" .. title,
  367. ZIndexBehavior = Enum.ZIndexBehavior.Sibling,
  368. ResetOnSpawn = false,
  369. Parent = gethui(),
  370. })
  371.  
  372. -- Optional blur
  373. local blur
  374. if acrylic then
  375. blur = New("BlurEffect", { Size = 8, Parent = CoreGui:FindFirstChildWhichIsA("Camera") or game.Workspace.CurrentCamera })
  376. if blur then
  377. blur.Enabled = true
  378. end
  379. end
  380.  
  381. -- Main Frame
  382. local main = New("Frame", {
  383. Name = "Main",
  384. BackgroundColor3 = T.Background,
  385. AnchorPoint = Vector2.new(0.5, 0.5),
  386. Position = UDim2.new(0.5, 0, 0.5, 0),
  387. Size = size,
  388. ClipsDescendants = true,
  389. Parent = gui,
  390. })
  391. AddCorner(main, 12)
  392. AddStroke(main, T.WindowStroke, 1)
  393.  
  394. -- ── Title Bar ─────────────────────────────────────────────────────────────
  395. local titleBar = New("Frame", {
  396. Name = "TitleBar",
  397. BackgroundColor3 = T.Background,
  398. Size = UDim2.new(1, 0, 0, 50),
  399. Parent = main,
  400. })
  401.  
  402. New("TextLabel", {
  403. BackgroundTransparency = 1,
  404. Position = UDim2.new(0, 16, 0, 8),
  405. Size = UDim2.new(0.7, 0, 0, 20),
  406. Text = title,
  407. TextColor3 = T.Text,
  408. TextSize = 15,
  409. Font = Enum.Font.GothamBold,
  410. TextXAlignment = Enum.TextXAlignment.Left,
  411. Parent = titleBar,
  412. })
  413.  
  414. if subtitle ~= "" then
  415. New("TextLabel", {
  416. BackgroundTransparency = 1,
  417. Position = UDim2.new(0, 16, 0, 28),
  418. Size = UDim2.new(0.7, 0, 0, 16),
  419. Text = subtitle,
  420. TextColor3 = T.SubText,
  421. TextSize = 11,
  422. Font = Enum.Font.Gotham,
  423. TextXAlignment = Enum.TextXAlignment.Left,
  424. Parent = titleBar,
  425. })
  426. end
  427.  
  428. -- Minimize button
  429. local minBtn = New("TextButton", {
  430. BackgroundColor3 = T.ButtonBg,
  431. AnchorPoint = Vector2.new(1, 0.5),
  432. Position = UDim2.new(1, -12, 0.5, 0),
  433. Size = UDim2.new(0, 28, 0, 28),
  434. Text = "—",
  435. TextColor3 = T.SubText,
  436. TextSize = 12,
  437. Font = Enum.Font.GothamBold,
  438. AutoButtonColor = false,
  439. Parent = titleBar,
  440. })
  441. AddCorner(minBtn, 6)
  442. HoverEffect(minBtn, T.ButtonBg, T.ElementBgHover)
  443.  
  444. -- Divider
  445. New("Frame", {
  446. BackgroundColor3 = T.WindowStroke,
  447. Position = UDim2.new(0, 0, 1, -1),
  448. Size = UDim2.new(1, 0, 0, 1),
  449. Parent = titleBar,
  450. })
  451.  
  452. -- ── Content Row ───────────────────────────────────────────────────────────
  453. local contentRow = New("Frame", {
  454. Name = "ContentRow",
  455. BackgroundTransparency = 1,
  456. Position = UDim2.new(0, 0, 0, 50),
  457. Size = UDim2.new(1, 0, 1, -50),
  458. Parent = main,
  459. })
  460.  
  461. -- Tab sidebar
  462. local sidebar = New("Frame", {
  463. Name = "Sidebar",
  464. BackgroundColor3 = T.TabBg,
  465. Size = UDim2.new(0, tabWidth, 1, 0),
  466. Parent = contentRow,
  467. })
  468. AddPadding(sidebar, 8, 6, 8, 6)
  469. AddList(sidebar, 4)
  470.  
  471. -- Tab content area
  472. local contentArea = New("Frame", {
  473. Name = "ContentArea",
  474. BackgroundColor3 = T.Second,
  475. Position = UDim2.new(0, tabWidth, 0, 0),
  476. Size = UDim2.new(1, -tabWidth, 1, 0),
  477. Parent = contentRow,
  478. })
  479.  
  480. -- ── Drag ──────────────────────────────────────────────────────────────────
  481. do
  482. local dragging, dragStart, startPos
  483. titleBar.InputBegan:Connect(function(input)
  484. if input.UserInputType == Enum.UserInputType.MouseButton1 then
  485. dragging = true
  486. dragStart = input.Position
  487. startPos = main.Position
  488. end
  489. end)
  490. titleBar.InputEnded:Connect(function(input)
  491. if input.UserInputType == Enum.UserInputType.MouseButton1 then
  492. dragging = false
  493. end
  494. end)
  495. UserInputService.InputChanged:Connect(function(input)
  496. if dragging and input.UserInputType == Enum.UserInputType.MouseMovement then
  497. local delta = input.Position - dragStart
  498. main.Position = UDim2.new(
  499. startPos.X.Scale, startPos.X.Offset + delta.X,
  500. startPos.Y.Scale, startPos.Y.Offset + delta.Y
  501. )
  502. end
  503. end)
  504. end
  505.  
  506. -- ── Minimize ──────────────────────────────────────────────────────────────
  507. local minimized = false
  508. local function toggleMinimize()
  509. minimized = not minimized
  510. if minimized then
  511. Tween(main, { Size = UDim2.new(0, size.X.Offset, 0, 50) }, 0.3, Enum.EasingStyle.Quint)
  512. minBtn.Text = "□"
  513. if blur then blur.Enabled = false end
  514. else
  515. Tween(main, { Size = size }, 0.3, Enum.EasingStyle.Quint)
  516. minBtn.Text = "—"
  517. if acrylic and blur then blur.Enabled = true end
  518. end
  519. Window.IsVisible = not minimized
  520. end
  521.  
  522. minBtn.MouseButton1Click:Connect(toggleMinimize)
  523. UserInputService.InputBegan:Connect(function(input, processed)
  524. if not processed and input.KeyCode == minimizeKey then
  525. toggleMinimize()
  526. end
  527. end)
  528.  
  529. function Window:SetVisible(v)
  530. gui.Enabled = v
  531. Window.IsVisible = v
  532. end
  533.  
  534. -- ── Helper: register element in Options ────────────────────────────────────
  535. local function RegisterOption(id, elem)
  536. if id and id ~= "" then
  537. Fluent.Options[id] = elem
  538. end
  539. end
  540.  
  541. -- ─────────────────────────────────────────────────────────────────────────
  542. -- ELEMENT BUILDERS (shared between Tab and CollapsibleSection)
  543. -- ─────────────────────────────────────────────────────────────────────────
  544. local function BuildSection(parent, name)
  545. local wrapper = New("Frame", {
  546. BackgroundTransparency = 1,
  547. Size = UDim2.new(1, 0, 0, 0),
  548. AutomaticSize = Enum.AutomaticSize.Y,
  549. })
  550.  
  551. local line = New("Frame", {
  552. BackgroundColor3 = T.ElementStroke,
  553. Size = UDim2.new(0.35, 0, 0, 1),
  554. AnchorPoint = Vector2.new(0, 0.5),
  555. Position = UDim2.new(0, 0, 0, 12),
  556. Parent = wrapper,
  557. })
  558. New("TextLabel", {
  559. BackgroundTransparency = 1,
  560. Position = UDim2.new(0.37, 0, 0, 0),
  561. Size = UDim2.new(0.26, 0, 0, 24),
  562. Text = name,
  563. TextColor3 = T.SubText,
  564. TextSize = 11,
  565. Font = Enum.Font.GothamBold,
  566. TextXAlignment = Enum.TextXAlignment.Center,
  567. Parent = wrapper,
  568. })
  569. New("Frame", {
  570. BackgroundColor3 = T.ElementStroke,
  571. Size = UDim2.new(0.35, 0, 0, 1),
  572. AnchorPoint = Vector2.new(1, 0.5),
  573. Position = UDim2.new(1, 0, 0, 12),
  574. Parent = wrapper,
  575. })
  576.  
  577. wrapper.Parent = parent
  578. return wrapper
  579. end
  580.  
  581. local function BuildToggle(parent, id, opts)
  582. opts = opts or {}
  583. local title = opts.Title or id
  584. local desc = opts.Description
  585. local default = opts.Default ~= nil and opts.Default or false
  586. local callback = opts.Callback or function() end
  587.  
  588. local elem = { Value = default, Type = "Toggle", _cbs = {} }
  589. function elem:OnChanged(fn) table.insert(self._cbs, fn) end
  590. function elem:_fire()
  591. callback(self.Value)
  592. for _, fn in ipairs(self._cbs) do fn(self.Value) end
  593. end
  594. function elem:SetValue(v)
  595. self.Value = v
  596. updateVisual(v)
  597. self:_fire()
  598. end
  599. RegisterOption(id, elem)
  600.  
  601. local h = desc and 52 or 38
  602. local frame = New("Frame", {
  603. BackgroundColor3 = T.ElementBg,
  604. Size = UDim2.new(1, 0, 0, h),
  605. })
  606. AddCorner(frame, 8)
  607. AddStroke(frame, T.ElementStroke)
  608.  
  609. New("TextLabel", {
  610. BackgroundTransparency = 1,
  611. Position = UDim2.new(0, 10, 0, desc and 8 or 0),
  612. Size = UDim2.new(1, -60, desc and 0 or 1, desc and 18 or 0),
  613. Text = title,
  614. TextColor3 = T.Text,
  615. TextSize = 13,
  616. Font = Enum.Font.GothamBold,
  617. TextXAlignment = Enum.TextXAlignment.Left,
  618. Parent = frame,
  619. })
  620. if desc then
  621. New("TextLabel", {
  622. BackgroundTransparency = 1,
  623. Position = UDim2.new(0, 10, 0, 27),
  624. Size = UDim2.new(1, -60, 0, 18),
  625. Text = desc,
  626. TextColor3 = T.SubText,
  627. TextSize = 11,
  628. Font = Enum.Font.Gotham,
  629. TextXAlignment = Enum.TextXAlignment.Left,
  630. Parent = frame,
  631. })
  632. end
  633.  
  634. -- Toggle track
  635. local track = New("Frame", {
  636. BackgroundColor3 = default and T.Toggle or T.ToggleOff,
  637. AnchorPoint = Vector2.new(1, 0.5),
  638. Position = UDim2.new(1, -10, 0.5, 0),
  639. Size = UDim2.new(0, 40, 0, 20),
  640. })
  641. AddCorner(track, 10)
  642. track.Parent = frame
  643.  
  644. local thumb = New("Frame", {
  645. BackgroundColor3 = Color3.new(1, 1, 1),
  646. AnchorPoint = Vector2.new(0.5, 0.5),
  647. Position = default and UDim2.new(0, 30, 0.5, 0) or UDim2.new(0, 10, 0.5, 0),
  648. Size = UDim2.new(0, 16, 0, 16),
  649. })
  650. AddCorner(thumb, 8)
  651. thumb.Parent = track
  652.  
  653. function updateVisual(v)
  654. Tween(track, {BackgroundColor3 = v and T.Toggle or T.ToggleOff}, 0.15)
  655. Tween(thumb, {Position = v and UDim2.new(0, 30, 0.5, 0) or UDim2.new(0, 10, 0.5, 0)}, 0.15)
  656. end
  657.  
  658. local clickArea = New("TextButton", {
  659. BackgroundTransparency = 1,
  660. Size = UDim2.new(1, 0, 1, 0),
  661. Text = "",
  662. AutoButtonColor = false,
  663. Parent = frame,
  664. })
  665. clickArea.MouseButton1Click:Connect(function()
  666. elem.Value = not elem.Value
  667. updateVisual(elem.Value)
  668. elem:_fire()
  669. end)
  670. HoverEffect(frame, T.ElementBg, T.ElementBgHover)
  671.  
  672. frame.Parent = parent
  673. return elem
  674. end
  675.  
  676. local function BuildSlider(parent, id, opts)
  677. opts = opts or {}
  678. local title = opts.Title or id
  679. local desc = opts.Description
  680. local min = opts.Min or 0
  681. local max = opts.Max or 100
  682. local default = opts.Default or min
  683. local rounding = opts.Rounding or 0
  684. local callback = opts.Callback or function() end
  685. local suffix = opts.Suffix or ""
  686.  
  687. local function round(v)
  688. if rounding == 0 then return math.floor(v + 0.5) end
  689. local f = 10 ^ rounding
  690. return math.floor(v * f + 0.5) / f
  691. end
  692.  
  693. local elem = { Value = round(default), Type = "Slider", _cbs = {} }
  694. function elem:OnChanged(fn) table.insert(self._cbs, fn) end
  695. function elem:_fire()
  696. callback(self.Value)
  697. for _, fn in ipairs(self._cbs) do fn(self.Value) end
  698. end
  699. function elem:SetValue(v)
  700. self.Value = round(math.clamp(v, min, max))
  701. updateVisual(self.Value)
  702. self:_fire()
  703. end
  704. RegisterOption(id, elem)
  705.  
  706. local h = desc and 62 or 52
  707. local frame = New("Frame", {
  708. BackgroundColor3 = T.ElementBg,
  709. Size = UDim2.new(1, 0, 0, h),
  710. })
  711. AddCorner(frame, 8)
  712. AddStroke(frame, T.ElementStroke)
  713.  
  714. New("TextLabel", {
  715. BackgroundTransparency = 1,
  716. Position = UDim2.new(0, 10, 0, desc and 8 or 6),
  717. Size = UDim2.new(0.6, 0, 0, 18),
  718. Text = title,
  719. TextColor3 = T.Text,
  720. TextSize = 13,
  721. Font = Enum.Font.GothamBold,
  722. TextXAlignment = Enum.TextXAlignment.Left,
  723. Parent = frame,
  724. })
  725. if desc then
  726. New("TextLabel", {
  727. BackgroundTransparency = 1,
  728. Position = UDim2.new(0, 10, 0, 26),
  729. Size = UDim2.new(0.6, 0, 0, 16),
  730. Text = desc,
  731. TextColor3 = T.SubText,
  732. TextSize = 11,
  733. Font = Enum.Font.Gotham,
  734. TextXAlignment = Enum.TextXAlignment.Left,
  735. Parent = frame,
  736. })
  737. end
  738.  
  739. local valLabel = New("TextLabel", {
  740. BackgroundTransparency = 1,
  741. AnchorPoint = Vector2.new(1, 0),
  742. Position = UDim2.new(1, -10, 0, desc and 8 or 6),
  743. Size = UDim2.new(0.35, 0, 0, 18),
  744. Text = tostring(round(default)) .. suffix,
  745. TextColor3 = T.SubText,
  746. TextSize = 12,
  747. Font = Enum.Font.Gotham,
  748. TextXAlignment = Enum.TextXAlignment.Right,
  749. Parent = frame,
  750. })
  751.  
  752. local trackY = desc and 44 or 34
  753. local track = New("Frame", {
  754. BackgroundColor3 = T.ElementStroke,
  755. Position = UDim2.new(0, 10, 0, trackY),
  756. Size = UDim2.new(1, -20, 0, 6),
  757. })
  758. AddCorner(track, 3)
  759. track.Parent = frame
  760.  
  761. local fill = New("Frame", {
  762. BackgroundColor3 = T.Toggle,
  763. Size = UDim2.new((round(default) - min) / math.max(max - min, 1), 0, 1, 0),
  764. })
  765. AddCorner(fill, 3)
  766. fill.Parent = track
  767.  
  768. local knob = New("Frame", {
  769. BackgroundColor3 = Color3.new(1, 1, 1),
  770. AnchorPoint = Vector2.new(0.5, 0.5),
  771. Position = UDim2.new((round(default) - min) / math.max(max - min, 1), 0, 0.5, 0),
  772. Size = UDim2.new(0, 14, 0, 14),
  773. })
  774. AddCorner(knob, 7)
  775. knob.Parent = track
  776.  
  777. function updateVisual(v)
  778. local pct = (v - min) / math.max(max - min, 1)
  779. Tween(fill, {Size = UDim2.new(pct, 0, 1, 0)}, 0.05)
  780. Tween(knob, {Position = UDim2.new(pct, 0, 0.5, 0)}, 0.05)
  781. valLabel.Text = tostring(v) .. suffix
  782. end
  783.  
  784. local dragging = false
  785. local function updateFromMouse(x)
  786. local abs = track.AbsolutePosition.X
  787. local sz = track.AbsoluteSize.X
  788. local pct = math.clamp((x - abs) / sz, 0, 1)
  789. local v = round(min + pct * (max - min))
  790. elem.Value = v
  791. updateVisual(v)
  792. elem:_fire()
  793. end
  794.  
  795. track.InputBegan:Connect(function(i)
  796. if i.UserInputType == Enum.UserInputType.MouseButton1 then
  797. dragging = true
  798. updateFromMouse(i.Position.X)
  799. end
  800. end)
  801. UserInputService.InputChanged:Connect(function(i)
  802. if dragging and i.UserInputType == Enum.UserInputType.MouseMovement then
  803. updateFromMouse(i.Position.X)
  804. end
  805. end)
  806. UserInputService.InputEnded:Connect(function(i)
  807. if i.UserInputType == Enum.UserInputType.MouseButton1 then dragging = false end
  808. end)
  809.  
  810. frame.Parent = parent
  811. return elem
  812. end
  813.  
  814. local function BuildDropdown(parent, id, opts)
  815. opts = opts or {}
  816. local title = opts.Title or id
  817. local desc = opts.Description
  818. local values = opts.Values or {}
  819. local multi = opts.Multi or false
  820. local default = opts.Default
  821. local callback = opts.Callback or function() end
  822.  
  823. -- Normalize default
  824. local initValue
  825. if multi then
  826. initValue = {}
  827. if type(default) == "table" then
  828. for _, v in ipairs(default) do initValue[v] = true end
  829. end
  830. else
  831. initValue = (type(default) == "number") and values[default] or (type(default) == "string" and default or (values[1] or ""))
  832. end
  833.  
  834. local elem = { Value = multi and {} or initValue, Type = "Dropdown", _cbs = {}, _multi = multi }
  835. if multi then
  836. if type(default) == "table" then
  837. for _, v in ipairs(default) do elem.Value[v] = true end
  838. end
  839. end
  840. function elem:OnChanged(fn) table.insert(self._cbs, fn) end
  841. function elem:_fire()
  842. if multi then
  843. local t = {}
  844. for k in pairs(self.Value) do table.insert(t, k) end
  845. callback(t)
  846. for _, fn in ipairs(self._cbs) do fn(t) end
  847. else
  848. callback(self.Value)
  849. for _, fn in ipairs(self._cbs) do fn(self.Value) end
  850. end
  851. end
  852. function elem:SetValue(v)
  853. if multi then
  854. self.Value = {}
  855. if type(v) == "table" then
  856. for _, k in ipairs(v) do self.Value[k] = true end
  857. end
  858. else
  859. self.Value = v
  860. end
  861. self:_fire()
  862. refreshDisplay()
  863. end
  864. RegisterOption(id, elem)
  865.  
  866. local baseH = desc and 58 or 44
  867. local frame = New("Frame", {
  868. BackgroundColor3 = T.ElementBg,
  869. Size = UDim2.new(1, 0, 0, baseH),
  870. ClipsDescendants = false,
  871. })
  872. AddCorner(frame, 8)
  873. AddStroke(frame, T.ElementStroke)
  874.  
  875. New("TextLabel", {
  876. BackgroundTransparency = 1,
  877. Position = UDim2.new(0, 10, 0, desc and 8 or 0),
  878. Size = UDim2.new(0.55, 0, desc and 0 or 1, desc and 18 or 0),
  879. Text = title,
  880. TextColor3 = T.Text,
  881. TextSize = 13,
  882. Font = Enum.Font.GothamBold,
  883. TextXAlignment = Enum.TextXAlignment.Left,
  884. Parent = frame,
  885. })
  886. if desc then
  887. New("TextLabel", {
  888. BackgroundTransparency = 1,
  889. Position = UDim2.new(0, 10, 0, 26),
  890. Size = UDim2.new(0.55, 0, 0, 16),
  891. Text = desc,
  892. TextColor3 = T.SubText,
  893. TextSize = 11,
  894. Font = Enum.Font.Gotham,
  895. TextXAlignment = Enum.TextXAlignment.Left,
  896. Parent = frame,
  897. })
  898. end
  899.  
  900. local displayBtn = New("TextButton", {
  901. BackgroundColor3 = T.ButtonBg,
  902. AnchorPoint = Vector2.new(1, 0.5),
  903. Position = UDim2.new(1, -10, 0.5, 0),
  904. Size = UDim2.new(0, 130, 0, 28),
  905. Text = "",
  906. AutoButtonColor = false,
  907. })
  908. AddCorner(displayBtn, 6)
  909. displayBtn.Parent = frame
  910.  
  911. local displayLabel = New("TextLabel", {
  912. BackgroundTransparency = 1,
  913. Position = UDim2.new(0, 8, 0, 0),
  914. Size = UDim2.new(1, -24, 1, 0),
  915. Text = multi and "Select..." or (initValue or "Select..."),
  916. TextColor3 = T.SubText,
  917. TextSize = 11,
  918. Font = Enum.Font.Gotham,
  919. TextXAlignment = Enum.TextXAlignment.Left,
  920. TextTruncate = Enum.TextTruncate.AtEnd,
  921. Parent = displayBtn,
  922. })
  923.  
  924. New("TextLabel", {
  925. BackgroundTransparency = 1,
  926. AnchorPoint = Vector2.new(1, 0.5),
  927. Position = UDim2.new(1, -6, 0.5, 0),
  928. Size = UDim2.new(0, 14, 0, 14),
  929. Text = "▾",
  930. TextColor3 = T.SubText,
  931. TextSize = 10,
  932. Font = Enum.Font.GothamBold,
  933. Parent = displayBtn,
  934. })
  935.  
  936. function refreshDisplay()
  937. if multi then
  938. local sel = {}
  939. for k in pairs(elem.Value) do table.insert(sel, k) end
  940. displayLabel.Text = #sel == 0 and "Select..." or table.concat(sel, ", ")
  941. else
  942. displayLabel.Text = elem.Value or "Select..."
  943. end
  944. end
  945. refreshDisplay()
  946.  
  947. -- Dropdown list
  948. local dropList = New("Frame", {
  949. BackgroundColor3 = T.Second,
  950. Position = UDim2.new(1, -140, 1, 4),
  951. Size = UDim2.new(0, 140, 0, 0),
  952. ClipsDescendants = true,
  953. Visible = false,
  954. ZIndex = 50,
  955. })
  956. AddCorner(dropList, 6)
  957. AddStroke(dropList, T.ElementStroke)
  958.  
  959. local dropScroll = New("ScrollingFrame", {
  960. BackgroundTransparency = 1,
  961. BorderSizePixel = 0,
  962. Size = UDim2.new(1, 0, 1, 0),
  963. CanvasSize = UDim2.new(0, 0, 0, 0),
  964. AutomaticCanvasSize = Enum.AutomaticSize.Y,
  965. ScrollBarThickness = 3,
  966. ZIndex = 51,
  967. Parent = dropList,
  968. })
  969. AddList(dropScroll, 2)
  970. AddPadding(dropScroll, 4, 4, 4, 4)
  971.  
  972. local dropOpen = false
  973. local function setDropOpen(v)
  974. dropOpen = v
  975. dropList.Visible = true
  976. if v then
  977. Tween(dropList, {Size = UDim2.new(0, 140, 0, math.min(#values * 28 + 8, 180))}, 0.15)
  978. else
  979. Tween(dropList, {Size = UDim2.new(0, 140, 0, 0)}, 0.12)
  980. task.delay(0.12, function() if not dropOpen then dropList.Visible = false end end)
  981. end
  982. end
  983.  
  984. -- Populate items
  985. for _, val in ipairs(values) do
  986. local item = New("TextButton", {
  987. BackgroundColor3 = T.Third,
  988. Size = UDim2.new(1, 0, 0, 26),
  989. Text = "",
  990. AutoButtonColor = false,
  991. ZIndex = 52,
  992. Parent = dropScroll,
  993. })
  994. AddCorner(item, 6)
  995.  
  996. local check = New("TextLabel", {
  997. BackgroundTransparency = 1,
  998. Position = UDim2.new(0, 6, 0, 0),
  999. Size = UDim2.new(0, 16, 1, 0),
  1000. Text = "✓",
  1001. TextColor3 = T.Toggle,
  1002. TextSize = 11,
  1003. Font = Enum.Font.GothamBold,
  1004. Visible = multi and elem.Value[val] or (elem.Value == val),
  1005. ZIndex = 53,
  1006. Parent = item,
  1007. })
  1008.  
  1009. New("TextLabel", {
  1010. BackgroundTransparency = 1,
  1011. Position = UDim2.new(0, multi and 24 or 8, 0, 0),
  1012. Size = UDim2.new(1, multi and -30 or -16, 1, 0),
  1013. Text = val,
  1014. TextColor3 = T.Text,
  1015. TextSize = 11,
  1016. Font = Enum.Font.Gotham,
  1017. TextXAlignment = Enum.TextXAlignment.Left,
  1018. ZIndex = 53,
  1019. Parent = item,
  1020. })
  1021.  
  1022. HoverEffect(item, T.Third, T.ElementBgHover)
  1023.  
  1024. local capturedVal = val
  1025. local capturedCheck = check
  1026. item.MouseButton1Click:Connect(function()
  1027. if multi then
  1028. elem.Value[capturedVal] = not elem.Value[capturedVal]
  1029. capturedCheck.Visible = elem.Value[capturedVal]
  1030. refreshDisplay()
  1031. elem:_fire()
  1032. else
  1033. elem.Value = capturedVal
  1034. for _, child in ipairs(dropScroll:GetChildren()) do
  1035. if child:IsA("TextButton") then
  1036. local c = child:FindFirstChildWhichIsA("TextLabel")
  1037. if c and c.Text == "✓" then c.Visible = false end
  1038. end
  1039. end
  1040. capturedCheck.Visible = true
  1041. refreshDisplay()
  1042. elem:_fire()
  1043. setDropOpen(false)
  1044. end
  1045. end)
  1046. end
  1047.  
  1048. dropList.Parent = frame
  1049.  
  1050. displayBtn.MouseButton1Click:Connect(function()
  1051. setDropOpen(not dropOpen)
  1052. end)
  1053.  
  1054. UserInputService.InputBegan:Connect(function(input)
  1055. if input.UserInputType == Enum.UserInputType.MouseButton1 and dropOpen then
  1056. local pos = input.Position
  1057. local dlPos = dropList.AbsolutePosition
  1058. local dlSize = dropList.AbsoluteSize
  1059. local inList = pos.X >= dlPos.X and pos.X <= dlPos.X + dlSize.X
  1060. and pos.Y >= dlPos.Y and pos.Y <= dlPos.Y + dlSize.Y
  1061. local dbPos = displayBtn.AbsolutePosition
  1062. local dbSize = displayBtn.AbsoluteSize
  1063. local inBtn = pos.X >= dbPos.X and pos.X <= dbPos.X + dbSize.X
  1064. and pos.Y >= dbPos.Y and pos.Y <= dbPos.Y + dbSize.Y
  1065. if not inList and not inBtn then
  1066. setDropOpen(false)
  1067. end
  1068. end
  1069. end)
  1070.  
  1071. frame.Parent = parent
  1072. return elem
  1073. end
  1074.  
  1075. local function BuildButton(parent, opts)
  1076. opts = opts or {}
  1077. local title = opts.Title or "Button"
  1078. local desc = opts.Description
  1079. local callback = opts.Callback or function() end
  1080.  
  1081. local h = desc and 52 or 38
  1082. local frame = New("TextButton", {
  1083. BackgroundColor3 = T.ElementBg,
  1084. Size = UDim2.new(1, 0, 0, h),
  1085. Text = "",
  1086. AutoButtonColor = false,
  1087. })
  1088. AddCorner(frame, 8)
  1089. AddStroke(frame, T.ElementStroke)
  1090.  
  1091. New("TextLabel", {
  1092. BackgroundTransparency = 1,
  1093. Position = UDim2.new(0, 10, 0, desc and 8 or 0),
  1094. Size = UDim2.new(1, -20, desc and 0 or 1, desc and 18 or 0),
  1095. Text = title,
  1096. TextColor3 = T.Text,
  1097. TextSize = 13,
  1098. Font = Enum.Font.GothamBold,
  1099. TextXAlignment = Enum.TextXAlignment.Left,
  1100. Parent = frame,
  1101. })
  1102. if desc then
  1103. New("TextLabel", {
  1104. BackgroundTransparency = 1,
  1105. Position = UDim2.new(0, 10, 0, 26),
  1106. Size = UDim2.new(1, -20, 0, 18),
  1107. Text = desc,
  1108. TextColor3 = T.SubText,
  1109. TextSize = 11,
  1110. Font = Enum.Font.Gotham,
  1111. TextXAlignment = Enum.TextXAlignment.Left,
  1112. Parent = frame,
  1113. })
  1114. end
  1115.  
  1116. HoverEffect(frame, T.ElementBg, T.ElementBgHover)
  1117. frame.MouseButton1Click:Connect(function()
  1118. Tween(frame, {BackgroundColor3 = T.AccentDark}, 0.05)
  1119. task.delay(0.15, function() Tween(frame, {BackgroundColor3 = T.ElementBg}, 0.1) end)
  1120. task.spawn(callback)
  1121. end)
  1122.  
  1123. frame.Parent = parent
  1124. end
  1125.  
  1126. local function BuildTextbox(parent, id, opts)
  1127. opts = opts or {}
  1128. local title = opts.Title or id
  1129. local desc = opts.Description
  1130. local default = opts.Default or ""
  1131. local placeholder = opts.Placeholder or "Enter text..."
  1132. local numeric = opts.Numeric or false
  1133. local finished = opts.Finished or false
  1134. local callback = opts.Callback or function() end
  1135.  
  1136. local elem = { Value = default, Type = "Textbox", _cbs = {} }
  1137. function elem:OnChanged(fn) table.insert(self._cbs, fn) end
  1138. function elem:_fire()
  1139. callback(self.Value)
  1140. for _, fn in ipairs(self._cbs) do fn(self.Value) end
  1141. end
  1142. function elem:SetValue(v)
  1143. self.Value = tostring(v)
  1144. if box then box.Text = self.Value end
  1145. self:_fire()
  1146. end
  1147. RegisterOption(id, elem)
  1148.  
  1149. local h = desc and 58 or 44
  1150. local frame = New("Frame", {
  1151. BackgroundColor3 = T.ElementBg,
  1152. Size = UDim2.new(1, 0, 0, h),
  1153. })
  1154. AddCorner(frame, 8)
  1155. AddStroke(frame, T.ElementStroke)
  1156.  
  1157. New("TextLabel", {
  1158. BackgroundTransparency = 1,
  1159. Position = UDim2.new(0, 10, 0, desc and 8 or 0),
  1160. Size = UDim2.new(0.45, 0, desc and 0 or 1, desc and 18 or 0),
  1161. Text = title,
  1162. TextColor3 = T.Text,
  1163. TextSize = 13,
  1164. Font = Enum.Font.GothamBold,
  1165. TextXAlignment = Enum.TextXAlignment.Left,
  1166. Parent = frame,
  1167. })
  1168. if desc then
  1169. New("TextLabel", {
  1170. BackgroundTransparency = 1,
  1171. Position = UDim2.new(0, 10, 0, 26),
  1172. Size = UDim2.new(0.45, 0, 0, 16),
  1173. Text = desc,
  1174. TextColor3 = T.SubText,
  1175. TextSize = 11,
  1176. Font = Enum.Font.Gotham,
  1177. TextXAlignment = Enum.TextXAlignment.Left,
  1178. Parent = frame,
  1179. })
  1180. end
  1181.  
  1182. local boxFrame = New("Frame", {
  1183. BackgroundColor3 = T.ButtonBg,
  1184. AnchorPoint = Vector2.new(1, 0.5),
  1185. Position = UDim2.new(1, -10, 0.5, 0),
  1186. Size = UDim2.new(0, 145, 0, 28),
  1187. Parent = frame,
  1188. })
  1189. AddCorner(boxFrame, 6)
  1190. AddStroke(boxFrame, T.ElementStroke)
  1191.  
  1192. local box = New("TextBox", {
  1193. BackgroundTransparency = 1,
  1194. Position = UDim2.new(0, 8, 0, 0),
  1195. Size = UDim2.new(1, -16, 1, 0),
  1196. Text = default,
  1197. PlaceholderText = placeholder,
  1198. TextColor3 = T.Text,
  1199. PlaceholderColor3 = T.DarkText,
  1200. TextSize = 11,
  1201. Font = Enum.Font.Gotham,
  1202. TextXAlignment = Enum.TextXAlignment.Left,
  1203. ClearTextOnFocus = false,
  1204. Parent = boxFrame,
  1205. })
  1206.  
  1207. box:GetPropertyChangedSignal("Text"):Connect(function()
  1208. if numeric then
  1209. local clean = box.Text:gsub("[^%d%.%-]", "")
  1210. box.Text = clean
  1211. end
  1212. elem.Value = box.Text
  1213. if not finished then elem:_fire() end
  1214. end)
  1215. box.FocusLost:Connect(function()
  1216. elem.Value = box.Text
  1217. if finished then elem:_fire() end
  1218. end)
  1219.  
  1220. frame.Parent = parent
  1221. return elem
  1222. end
  1223.  
  1224. local function BuildKeybind(parent, id, opts)
  1225. opts = opts or {}
  1226. local title = opts.Title or id
  1227. local desc = opts.Description
  1228. local default = opts.Default or Enum.KeyCode.Unknown
  1229. local callback = opts.Callback or function() end
  1230. local mode = opts.Mode or "Toggle"
  1231.  
  1232. local elem = { Value = default, Type = "Keybind", _cbs = {} }
  1233. function elem:OnChanged(fn) table.insert(self._cbs, fn) end
  1234. function elem:_fire()
  1235. callback()
  1236. for _, fn in ipairs(self._cbs) do fn(self.Value) end
  1237. end
  1238. function elem:SetValue(v)
  1239. self.Value = v
  1240. if btnLabel then btnLabel.Text = v == Enum.KeyCode.Unknown and "None" or v.Name end
  1241. end
  1242. RegisterOption(id, elem)
  1243.  
  1244. local h = desc and 52 or 38
  1245. local frame = New("Frame", {
  1246. BackgroundColor3 = T.ElementBg,
  1247. Size = UDim2.new(1, 0, 0, h),
  1248. })
  1249. AddCorner(frame, 8)
  1250. AddStroke(frame, T.ElementStroke)
  1251.  
  1252. New("TextLabel", {
  1253. BackgroundTransparency = 1,
  1254. Position = UDim2.new(0, 10, 0, desc and 8 or 0),
  1255. Size = UDim2.new(0.55, 0, desc and 0 or 1, desc and 18 or 0),
  1256. Text = title,
  1257. TextColor3 = T.Text,
  1258. TextSize = 13,
  1259. Font = Enum.Font.GothamBold,
  1260. TextXAlignment = Enum.TextXAlignment.Left,
  1261. Parent = frame,
  1262. })
  1263. if desc then
  1264. New("TextLabel", {
  1265. BackgroundTransparency = 1,
  1266. Position = UDim2.new(0, 10, 0, 26),
  1267. Size = UDim2.new(0.55, 0, 0, 16),
  1268. Text = desc,
  1269. TextColor3 = T.SubText,
  1270. TextSize = 11,
  1271. Font = Enum.Font.Gotham,
  1272. TextXAlignment = Enum.TextXAlignment.Left,
  1273. Parent = frame,
  1274. })
  1275. end
  1276.  
  1277. local kbBtn = New("TextButton", {
  1278. BackgroundColor3 = T.ButtonBg,
  1279. AnchorPoint = Vector2.new(1, 0.5),
  1280. Position = UDim2.new(1, -10, 0.5, 0),
  1281. Size = UDim2.new(0, 90, 0, 26),
  1282. Text = "",
  1283. AutoButtonColor = false,
  1284. Parent = frame,
  1285. })
  1286. AddCorner(kbBtn, 6)
  1287.  
  1288. local btnLabel = New("TextLabel", {
  1289. BackgroundTransparency = 1,
  1290. Size = UDim2.new(1, 0, 1, 0),
  1291. Text = default == Enum.KeyCode.Unknown and "None" or default.Name,
  1292. TextColor3 = T.SubText,
  1293. TextSize = 11,
  1294. Font = Enum.Font.Gotham,
  1295. Parent = kbBtn,
  1296. })
  1297.  
  1298. local listening = false
  1299. kbBtn.MouseButton1Click:Connect(function()
  1300. listening = not listening
  1301. btnLabel.Text = listening and "..." or (elem.Value == Enum.KeyCode.Unknown and "None" or elem.Value.Name)
  1302. Tween(kbBtn, {BackgroundColor3 = listening and T.Toggle or T.ButtonBg}, 0.1)
  1303. end)
  1304.  
  1305. UserInputService.InputBegan:Connect(function(input, processed)
  1306. if listening then
  1307. if input.UserInputType == Enum.UserInputType.Keyboard then
  1308. elem.Value = input.KeyCode
  1309. btnLabel.Text = input.KeyCode.Name
  1310. listening = false
  1311. Tween(kbBtn, {BackgroundColor3 = T.ButtonBg}, 0.1)
  1312. end
  1313. elseif not processed and input.KeyCode == elem.Value and elem.Value ~= Enum.KeyCode.Unknown then
  1314. elem:_fire()
  1315. end
  1316. end)
  1317.  
  1318. frame.Parent = parent
  1319. return elem
  1320. end
  1321.  
  1322. local function BuildColorpicker(parent, id, opts)
  1323. opts = opts or {}
  1324. local title = opts.Title or id
  1325. local desc = opts.Description
  1326. local default = opts.Default or Color3.fromRGB(255, 255, 255)
  1327. local callback = opts.Callback or function() end
  1328.  
  1329. local elem = { Value = default, Type = "ColorPicker", _cbs = {} }
  1330. function elem:OnChanged(fn) table.insert(self._cbs, fn) end
  1331. function elem:_fire()
  1332. callback(self.Value)
  1333. for _, fn in ipairs(self._cbs) do fn(self.Value) end
  1334. end
  1335. function elem:SetValue(c)
  1336. self.Value = c
  1337. if preview then preview.BackgroundColor3 = c end
  1338. end
  1339. RegisterOption(id, elem)
  1340.  
  1341. local h = desc and 52 or 38
  1342. local frame = New("Frame", {
  1343. BackgroundColor3 = T.ElementBg,
  1344. Size = UDim2.new(1, 0, 0, h),
  1345. })
  1346. AddCorner(frame, 8)
  1347. AddStroke(frame, T.ElementStroke)
  1348.  
  1349. New("TextLabel", {
  1350. BackgroundTransparency = 1,
  1351. Position = UDim2.new(0, 10, 0, desc and 8 or 0),
  1352. Size = UDim2.new(0.6, 0, desc and 0 or 1, desc and 18 or 0),
  1353. Text = title,
  1354. TextColor3 = T.Text,
  1355. TextSize = 13,
  1356. Font = Enum.Font.GothamBold,
  1357. TextXAlignment = Enum.TextXAlignment.Left,
  1358. Parent = frame,
  1359. })
  1360. if desc then
  1361. New("TextLabel", {
  1362. BackgroundTransparency = 1,
  1363. Position = UDim2.new(0, 10, 0, 26),
  1364. Size = UDim2.new(0.6, 0, 0, 16),
  1365. Text = desc,
  1366. TextColor3 = T.SubText,
  1367. TextSize = 11,
  1368. Font = Enum.Font.Gotham,
  1369. TextXAlignment = Enum.TextXAlignment.Left,
  1370. Parent = frame,
  1371. })
  1372. end
  1373.  
  1374. local preview = New("Frame", {
  1375. BackgroundColor3 = default,
  1376. AnchorPoint = Vector2.new(1, 0.5),
  1377. Position = UDim2.new(1, -10, 0.5, 0),
  1378. Size = UDim2.new(0, 32, 0, 28),
  1379. Parent = frame,
  1380. })
  1381. AddCorner(preview, 6)
  1382. AddStroke(preview, T.ElementStroke)
  1383.  
  1384. -- Color picker popup (simple HSV-based)
  1385. local pickerOpen = false
  1386. local picker = New("Frame", {
  1387. BackgroundColor3 = T.Second,
  1388. Position = UDim2.new(1, -185, 1, 6),
  1389. Size = UDim2.new(0, 180, 0, 175),
  1390. Visible = false,
  1391. ZIndex = 60,
  1392. ClipsDescendants = false,
  1393. })
  1394. AddCorner(picker, 8)
  1395. AddStroke(picker, T.ElementStroke)
  1396. picker.Parent = frame
  1397.  
  1398. -- SV square
  1399. local svFrame = New("Frame", {
  1400. BackgroundColor3 = Color3.new(1, 0, 0),
  1401. Position = UDim2.new(0, 8, 0, 8),
  1402. Size = UDim2.new(1, -16, 0, 110),
  1403. ZIndex = 61,
  1404. Parent = picker,
  1405. })
  1406. AddCorner(svFrame, 4)
  1407.  
  1408. -- White-to-transparent gradient (horizontal)
  1409. local wGrad = New("UIGradient", {
  1410. Color = ColorSequence.new({ ColorSequenceKeypoint.new(0, Color3.new(1,1,1)), ColorSequenceKeypoint.new(1, Color3.new(1,1,1)) }),
  1411. Transparency = NumberSequence.new({ NumberSequenceKeypoint.new(0, 0), NumberSequenceKeypoint.new(1, 1) }),
  1412. Rotation = 0,
  1413. Parent = svFrame,
  1414. })
  1415. -- Overlay: transparent-to-black (vertical)
  1416. local overlay = New("Frame", {
  1417. BackgroundColor3 = Color3.new(0, 0, 0),
  1418. BackgroundTransparency = 0,
  1419. Size = UDim2.new(1, 0, 1, 0),
  1420. ZIndex = 62,
  1421. Parent = svFrame,
  1422. })
  1423. New("UIGradient", {
  1424. Color = ColorSequence.new(Color3.new(0,0,0), Color3.new(0,0,0)),
  1425. Transparency = NumberSequence.new({ NumberSequenceKeypoint.new(0, 1), NumberSequenceKeypoint.new(1, 0) }),
  1426. Rotation = 90,
  1427. Parent = overlay,
  1428. })
  1429.  
  1430. local svKnob = New("Frame", {
  1431. BackgroundColor3 = Color3.new(1,1,1),
  1432. AnchorPoint = Vector2.new(0.5, 0.5),
  1433. Position = UDim2.new(1, 0, 0, 0),
  1434. Size = UDim2.new(0, 10, 0, 10),
  1435. ZIndex = 63,
  1436. Parent = svFrame,
  1437. })
  1438. AddCorner(svKnob, 5)
  1439.  
  1440. -- Hue bar
  1441. local hueBar = New("Frame", {
  1442. Position = UDim2.new(0, 8, 0, 124),
  1443. Size = UDim2.new(1, -16, 0, 12),
  1444. ZIndex = 61,
  1445. Parent = picker,
  1446. })
  1447. AddCorner(hueBar, 4)
  1448. local hueGrad = New("UIGradient", {
  1449. Color = ColorSequence.new({
  1450. ColorSequenceKeypoint.new(0, Color3.fromHSV(0,1,1)),
  1451. ColorSequenceKeypoint.new(0.17, Color3.fromHSV(0.17,1,1)),
  1452. ColorSequenceKeypoint.new(0.33, Color3.fromHSV(0.33,1,1)),
  1453. ColorSequenceKeypoint.new(0.5, Color3.fromHSV(0.5,1,1)),
  1454. ColorSequenceKeypoint.new(0.67, Color3.fromHSV(0.67,1,1)),
  1455. ColorSequenceKeypoint.new(0.83, Color3.fromHSV(0.83,1,1)),
  1456. ColorSequenceKeypoint.new(1, Color3.fromHSV(1,1,1)),
  1457. }),
  1458. Parent = hueBar,
  1459. })
  1460.  
  1461. local hueKnob = New("Frame", {
  1462. BackgroundColor3 = Color3.new(1,1,1),
  1463. AnchorPoint = Vector2.new(0.5, 0.5),
  1464. Position = UDim2.new(0, 0, 0.5, 0),
  1465. Size = UDim2.new(0, 8, 0, 16),
  1466. ZIndex = 62,
  1467. Parent = hueBar,
  1468. })
  1469. AddCorner(hueKnob, 3)
  1470.  
  1471. -- Hex input
  1472. local hexBox = New("TextBox", {
  1473. BackgroundColor3 = T.ButtonBg,
  1474. Position = UDim2.new(0, 8, 0, 142),
  1475. Size = UDim2.new(1, -16, 0, 24),
  1476. Text = string.format("#%02X%02X%02X", math.floor(default.R*255), math.floor(default.G*255), math.floor(default.B*255)),
  1477. TextColor3 = T.Text,
  1478. TextSize = 11,
  1479. Font = Enum.Font.Gotham,
  1480. ZIndex = 61,
  1481. Parent = picker,
  1482. })
  1483. AddCorner(hexBox, 4)
  1484.  
  1485. local h_, s_, v_ = Color3.toHSV(default)
  1486. local currentH, currentS, currentV = h_, s_, v_
  1487.  
  1488. local function applyColor()
  1489. local c = Color3.fromHSV(currentH, currentS, currentV)
  1490. elem.Value = c
  1491. preview.BackgroundColor3 = c
  1492. svFrame.BackgroundColor3 = Color3.fromHSV(currentH, 1, 1)
  1493. hexBox.Text = string.format("#%02X%02X%02X", math.floor(c.R*255), math.floor(c.G*255), math.floor(c.B*255))
  1494. elem:_fire()
  1495. end
  1496.  
  1497. -- SV drag
  1498. local svDrag = false
  1499. svFrame.InputBegan:Connect(function(i)
  1500. if i.UserInputType == Enum.UserInputType.MouseButton1 then svDrag = true end
  1501. end)
  1502. UserInputService.InputChanged:Connect(function(i)
  1503. if svDrag and i.UserInputType == Enum.UserInputType.MouseMovement then
  1504. local p = svFrame.AbsolutePosition
  1505. local sz = svFrame.AbsoluteSize
  1506. currentS = math.clamp((i.Position.X - p.X) / sz.X, 0, 1)
  1507. currentV = 1 - math.clamp((i.Position.Y - p.Y) / sz.Y, 0, 1)
  1508. svKnob.Position = UDim2.new(currentS, 0, 1 - currentV, 0)
  1509. applyColor()
  1510. end
  1511. end)
  1512. UserInputService.InputEnded:Connect(function(i)
  1513. if i.UserInputType == Enum.UserInputType.MouseButton1 then svDrag = false end
  1514. end)
  1515.  
  1516. -- Hue drag
  1517. local hueDrag = false
  1518. hueBar.InputBegan:Connect(function(i)
  1519. if i.UserInputType == Enum.UserInputType.MouseButton1 then hueDrag = true end
  1520. end)
  1521. UserInputService.InputChanged:Connect(function(i)
  1522. if hueDrag and i.UserInputType == Enum.UserInputType.MouseMovement then
  1523. local p = hueBar.AbsolutePosition
  1524. local sz = hueBar.AbsoluteSize
  1525. currentH = math.clamp((i.Position.X - p.X) / sz.X, 0, 1)
  1526. hueKnob.Position = UDim2.new(currentH, 0, 0.5, 0)
  1527. svFrame.BackgroundColor3 = Color3.fromHSV(currentH, 1, 1)
  1528. applyColor()
  1529. end
  1530. end)
  1531. UserInputService.InputEnded:Connect(function(i)
  1532. if i.UserInputType == Enum.UserInputType.MouseButton1 then hueDrag = false end
  1533. end)
  1534.  
  1535. hexBox.FocusLost:Connect(function()
  1536. local hex = hexBox.Text:gsub("#", "")
  1537. if #hex == 6 then
  1538. local r = tonumber(hex:sub(1,2), 16) or 0
  1539. local g = tonumber(hex:sub(3,4), 16) or 0
  1540. local b = tonumber(hex:sub(5,6), 16) or 0
  1541. local c = Color3.fromRGB(r, g, b)
  1542. currentH, currentS, currentV = Color3.toHSV(c)
  1543. applyColor()
  1544. end
  1545. end)
  1546.  
  1547. -- Toggle picker
  1548. local pickerBtn = New("TextButton", {
  1549. BackgroundTransparency = 1,
  1550. Size = UDim2.new(1, 0, 1, 0),
  1551. Text = "",
  1552. Parent = preview,
  1553. ZIndex = 2,
  1554. })
  1555. pickerBtn.MouseButton1Click:Connect(function()
  1556. pickerOpen = not pickerOpen
  1557. picker.Visible = pickerOpen
  1558. end)
  1559.  
  1560. UserInputService.InputBegan:Connect(function(input)
  1561. if input.UserInputType == Enum.UserInputType.MouseButton1 and pickerOpen then
  1562. local pos = input.Position
  1563. local pPos = picker.AbsolutePosition
  1564. local pSize = picker.AbsoluteSize
  1565. local inside = pos.X >= pPos.X and pos.X <= pPos.X + pSize.X
  1566. and pos.Y >= pPos.Y and pos.Y <= pPos.Y + pSize.Y
  1567. local pvPos = preview.AbsolutePosition
  1568. local pvSize = preview.AbsoluteSize
  1569. local inPrev = pos.X >= pvPos.X and pos.X <= pvPos.X + pvSize.X
  1570. and pos.Y >= pvPos.Y and pos.Y <= pvPos.Y + pvSize.Y
  1571. if not inside and not inPrev then
  1572. pickerOpen = false
  1573. picker.Visible = false
  1574. end
  1575. end
  1576. end)
  1577.  
  1578. frame.Parent = parent
  1579. return elem
  1580. end
  1581.  
  1582. local function BuildLabel(parent, text, color)
  1583. local lbl = New("TextLabel", {
  1584. BackgroundTransparency = 1,
  1585. Size = UDim2.new(1, 0, 0, 28),
  1586. Text = text or "",
  1587. TextColor3 = color or T.SubText,
  1588. TextSize = 12,
  1589. Font = Enum.Font.Gotham,
  1590. TextXAlignment = Enum.TextXAlignment.Left,
  1591. TextWrapped = true,
  1592. Parent = parent,
  1593. })
  1594. AddPadding(lbl, 0, 0, 0, 10)
  1595. return lbl
  1596. end
  1597.  
  1598. -- ─────────────────────────────────────────────────────────────────────────
  1599. -- COLLAPSIBLE SECTION (NEW)
  1600. -- ─────────────────────────────────────────────────────────────────────────
  1601. local function BuildCollapsibleSection(parent, name)
  1602. local wrapper = New("Frame", {
  1603. BackgroundColor3 = T.SectionBg,
  1604. Size = UDim2.new(1, 0, 0, 36),
  1605. ClipsDescendants = true,
  1606. })
  1607. AddCorner(wrapper, 8)
  1608. AddStroke(wrapper, T.ElementStroke)
  1609.  
  1610. -- Header button
  1611. local header = New("TextButton", {
  1612. BackgroundColor3 = T.SectionHeader,
  1613. Size = UDim2.new(1, 0, 0, 36),
  1614. Text = "",
  1615. AutoButtonColor = false,
  1616. Parent = wrapper,
  1617. })
  1618. AddCorner(header, 8)
  1619.  
  1620. local arrow = New("TextLabel", {
  1621. BackgroundTransparency = 1,
  1622. Position = UDim2.new(0, 8, 0, 0),
  1623. Size = UDim2.new(0, 20, 1, 0),
  1624. Text = "▶",
  1625. TextColor3 = T.SubText,
  1626. TextSize = 10,
  1627. Font = Enum.Font.GothamBold,
  1628. Parent = header,
  1629. })
  1630. New("TextLabel", {
  1631. BackgroundTransparency = 1,
  1632. Position = UDim2.new(0, 30, 0, 0),
  1633. Size = UDim2.new(1, -38, 1, 0),
  1634. Text = name,
  1635. TextColor3 = T.Text,
  1636. TextSize = 13,
  1637. Font = Enum.Font.GothamBold,
  1638. TextXAlignment = Enum.TextXAlignment.Left,
  1639. Parent = header,
  1640. })
  1641.  
  1642. -- Content frame
  1643. local content = New("Frame", {
  1644. BackgroundTransparency = 1,
  1645. Position = UDim2.new(0, 0, 0, 38),
  1646. Size = UDim2.new(1, 0, 0, 0),
  1647. AutomaticSize = Enum.AutomaticSize.Y,
  1648. Visible = false,
  1649. Parent = wrapper,
  1650. })
  1651. local contentList = AddList(content, 6)
  1652. AddPadding(content, 2, 6, 8, 6)
  1653.  
  1654. -- Auto-resize wrapper
  1655. local function updateHeight()
  1656. local collapsed = not content.Visible
  1657. if not collapsed then
  1658. local h = contentList.AbsoluteContentSize.Y + 38 + 14
  1659. Tween(wrapper, { Size = UDim2.new(1, 0, 0, h) }, 0.2, Enum.EasingStyle.Quint)
  1660. else
  1661. Tween(wrapper, { Size = UDim2.new(1, 0, 0, 36) }, 0.2, Enum.EasingStyle.Quint)
  1662. end
  1663. end
  1664. contentList:GetPropertyChangedSignal("AbsoluteContentSize"):Connect(function()
  1665. if content.Visible then updateHeight() end
  1666. end)
  1667.  
  1668. -- Toggle collapse
  1669. header.MouseButton1Click:Connect(function()
  1670. if content.Visible then
  1671. -- Collapse
  1672. content.Visible = false
  1673. arrow.Text = "▶"
  1674. Tween(wrapper, { Size = UDim2.new(1, 0, 0, 36) }, 0.2, Enum.EasingStyle.Quint)
  1675. else
  1676. -- Expand
  1677. content.Visible = true
  1678. arrow.Text = "▼"
  1679. task.defer(updateHeight)
  1680. end
  1681. end)
  1682.  
  1683. HoverEffect(header, T.SectionHeader, T.ElementBgHover)
  1684. wrapper.Parent = parent
  1685.  
  1686. -- Section proxy: exposes same Add* API
  1687. local Section = {}
  1688. Section._content = content
  1689. Section._parent = parent
  1690.  
  1691. function Section:AddSection(sname)
  1692. BuildSection(content, sname)
  1693. end
  1694. function Section:AddToggle(sid, sopts)
  1695. return BuildToggle(content, sid, sopts)
  1696. end
  1697. function Section:AddSlider(sid, sopts)
  1698. return BuildSlider(content, sid, sopts)
  1699. end
  1700. function Section:AddDropdown(sid, sopts)
  1701. return BuildDropdown(content, sid, sopts)
  1702. end
  1703. function Section:AddButton(sopts)
  1704. return BuildButton(content, sopts)
  1705. end
  1706. function Section:AddTextbox(sid, sopts)
  1707. return BuildTextbox(content, sid, sopts)
  1708. end
  1709. function Section:AddKeybind(sid, sopts)
  1710. return BuildKeybind(content, sid, sopts)
  1711. end
  1712. function Section:AddColorpicker(sid, sopts)
  1713. return BuildColorpicker(content, sid, sopts)
  1714. end
  1715. function Section:AddLabel(text, color)
  1716. return BuildLabel(content, text, color)
  1717. end
  1718. function Section:AddCollapsibleSection(sname)
  1719. return BuildCollapsibleSection(content, sname)
  1720. end
  1721. function Section:AddPetPicker(sid, sopts)
  1722. return BuildPetPicker(content, sid, sopts)
  1723. end
  1724.  
  1725. return Section
  1726. end
  1727.  
  1728. -- ─────────────────────────────────────────────────────────────────────────
  1729. -- PET PICKER (NEW)
  1730. -- ─────────────────────────────────────────────────────────────────────────
  1731. --
  1732. -- options = {
  1733. -- Title = "Pets to Keep",
  1734. -- Description = "...",
  1735. -- Pets = { "Huge Cat", ... },
  1736. -- Default = { {Name="Huge Cat", Rarity="Normal"}, ... },
  1737. -- MaxDropdown = 20,
  1738. -- Callback = function(value) end,
  1739. -- }
  1740. --
  1741. -- Value: array of { Name = string, Rarity = "Normal"|"Golden"|"Rainbow" }
  1742. -- Saved/loaded via SaveManager: element registered in Fluent.Options[id]
  1743. -- SaveManager stores/restores as JSON array of {Name,Rarity} objects
  1744. --
  1745. local RarityDefs = {
  1746. Normal = { label = "N", active = Color3.fromRGB(120, 120, 130), inactive = Color3.fromRGB(50, 50, 55) },
  1747. Golden = { label = "G", active = Color3.fromRGB(255, 195, 40), inactive = Color3.fromRGB(70, 52, 10) },
  1748. Rainbow = { label = "R", active = Color3.fromRGB(185, 90, 255), inactive = Color3.fromRGB(60, 20, 85) },
  1749. }
  1750. local RarityOrder = { "Normal", "Golden", "Rainbow" }
  1751.  
  1752. local ChipColors = {
  1753. Normal = Color3.fromRGB(80, 80, 90),
  1754. Golden = Color3.fromRGB(145, 100, 18),
  1755. Rainbow = Color3.fromRGB(105, 40, 165),
  1756. }
  1757.  
  1758. function BuildPetPicker(parent, id, opts)
  1759. opts = opts or {}
  1760. local ptitle = opts.Title or "Pet Picker"
  1761. local pdesc = opts.Description or nil
  1762. local petList = opts.Pets or {}
  1763. local maxDrop = opts.MaxDropdown or 20
  1764. local callback = opts.Callback or function() end
  1765. local default = opts.Default or {}
  1766.  
  1767. -- ── Element object ────────────────────────────────────────────────
  1768. local selected = {}
  1769. for _, v in ipairs(default) do
  1770. table.insert(selected, { Name = v.Name, Rarity = v.Rarity })
  1771. end
  1772.  
  1773. local elem = { Value = selected, Type = "PetPicker", _cbs = {} }
  1774. function elem:OnChanged(fn) table.insert(self._cbs, fn) end
  1775. function elem:_fire()
  1776. callback(self.Value)
  1777. for _, fn in ipairs(self._cbs) do fn(self.Value) end
  1778. end
  1779. function elem:SetValue(val)
  1780. selected = {}
  1781. self.Value = selected
  1782. for _, v in ipairs(val or {}) do
  1783. table.insert(selected, { Name = v.Name, Rarity = v.Rarity })
  1784. end
  1785. if rebuildChips then rebuildChips() end
  1786. self:_fire()
  1787. end
  1788. RegisterOption(id, elem)
  1789.  
  1790. -- ── Sizes ──────────────────────────────────────────────────────────
  1791. local HEADER_H = pdesc and 52 or 36
  1792. local CHIPS_H = 34
  1793. local SEARCH_H = 32
  1794. local GAP = 6
  1795. local BASE_H = HEADER_H + CHIPS_H + GAP + SEARCH_H + GAP * 2
  1796. local ITEM_H = 30
  1797. local MAX_DROP_H = ITEM_H * 6 + 10
  1798.  
  1799. -- ── Root frame ────────────────────────────────────────────────────
  1800. local root = New("Frame", {
  1801. BackgroundColor3 = T.ElementBg,
  1802. Size = UDim2.new(1, 0, 0, BASE_H),
  1803. ClipsDescendants = false,
  1804. })
  1805. AddCorner(root, 8)
  1806. AddStroke(root, T.ElementStroke)
  1807.  
  1808. -- Title
  1809. New("TextLabel", {
  1810. BackgroundTransparency = 1,
  1811. Position = UDim2.new(0, 10, 0, 8),
  1812. Size = UDim2.new(1, -20, 0, 18),
  1813. Text = ptitle,
  1814. TextColor3 = T.Text,
  1815. TextSize = 13,
  1816. Font = Enum.Font.GothamBold,
  1817. TextXAlignment = Enum.TextXAlignment.Left,
  1818. ZIndex = 2,
  1819. Parent = root,
  1820. })
  1821. if pdesc then
  1822. New("TextLabel", {
  1823. BackgroundTransparency = 1,
  1824. Position = UDim2.new(0, 10, 0, 26),
  1825. Size = UDim2.new(1, -20, 0, 16),
  1826. Text = pdesc,
  1827. TextColor3 = T.SubText,
  1828. TextSize = 11,
  1829. Font = Enum.Font.Gotham,
  1830. TextXAlignment = Enum.TextXAlignment.Left,
  1831. ZIndex = 2,
  1832. Parent = root,
  1833. })
  1834. end
  1835.  
  1836. -- ── Chips scroll ──────────────────────────────────────────────────
  1837. local chipsScroll = New("ScrollingFrame", {
  1838. BackgroundColor3 = T.Second,
  1839. BorderSizePixel = 0,
  1840. Position = UDim2.new(0, 8, 0, HEADER_H),
  1841. Size = UDim2.new(1, -16, 0, CHIPS_H),
  1842. CanvasSize = UDim2.new(0, 0, 0, 0),
  1843. AutomaticCanvasSize = Enum.AutomaticSize.X,
  1844. ScrollingDirection = Enum.ScrollingDirection.X,
  1845. ScrollBarThickness = 2,
  1846. ZIndex = 2,
  1847. Parent = root,
  1848. })
  1849. AddCorner(chipsScroll, 6)
  1850. local chipsList = AddList(chipsScroll, 4, Enum.FillDirection.Horizontal)
  1851. chipsList.VerticalAlignment = Enum.VerticalAlignment.Center
  1852. AddPadding(chipsScroll, 0, 4, 0, 4)
  1853.  
  1854. -- ── Search frame ──────────────────────────────────────────────────
  1855. local searchFrame = New("Frame", {
  1856. BackgroundColor3 = T.Second,
  1857. Position = UDim2.new(0, 8, 0, HEADER_H + CHIPS_H + GAP),
  1858. Size = UDim2.new(1, -16, 0, SEARCH_H),
  1859. ZIndex = 2,
  1860. Parent = root,
  1861. })
  1862. AddCorner(searchFrame, 6)
  1863. AddStroke(searchFrame, T.ElementStroke)
  1864.  
  1865. New("TextLabel", {
  1866. BackgroundTransparency = 1,
  1867. Position = UDim2.new(0, 8, 0, 0),
  1868. Size = UDim2.new(0, 18, 1, 0),
  1869. Text = "🔍",
  1870. TextSize = 12,
  1871. Font = Enum.Font.Gotham,
  1872. ZIndex = 3,
  1873. Parent = searchFrame,
  1874. })
  1875.  
  1876. local searchBox = New("TextBox", {
  1877. BackgroundTransparency = 1,
  1878. Position = UDim2.new(0, 28, 0, 0),
  1879. Size = UDim2.new(1, -36, 1, 0),
  1880. Text = "",
  1881. PlaceholderText = "Search pets...",
  1882. TextColor3 = T.Text,
  1883. PlaceholderColor3 = T.DarkText,
  1884. TextSize = 11,
  1885. Font = Enum.Font.Gotham,
  1886. TextXAlignment = Enum.TextXAlignment.Left,
  1887. ClearTextOnFocus = false,
  1888. ZIndex = 3,
  1889. Parent = searchFrame,
  1890. })
  1891.  
  1892. -- ── Dropdown panel ────────────────────────────────────────────────
  1893. local dropPanel = New("Frame", {
  1894. BackgroundColor3 = T.Second,
  1895. Position = UDim2.new(0, 8, 0, HEADER_H + CHIPS_H + GAP + SEARCH_H + 4),
  1896. Size = UDim2.new(1, -16, 0, 0),
  1897. ClipsDescendants = true,
  1898. Visible = false,
  1899. ZIndex = 20,
  1900. Parent = root,
  1901. })
  1902. AddCorner(dropPanel, 6)
  1903. AddStroke(dropPanel, T.ElementStroke)
  1904.  
  1905. local dropScroll = New("ScrollingFrame", {
  1906. BackgroundTransparency = 1,
  1907. BorderSizePixel = 0,
  1908. Size = UDim2.new(1, 0, 1, 0),
  1909. CanvasSize = UDim2.new(0, 0, 0, 0),
  1910. AutomaticCanvasSize = Enum.AutomaticSize.Y,
  1911. ScrollBarThickness = 4,
  1912. ZIndex = 21,
  1913. Parent = dropPanel,
  1914. })
  1915. AddList(dropScroll, 2)
  1916. AddPadding(dropScroll, 4, 4, 4, 4)
  1917.  
  1918. -- ── Helpers ────────────────────────────────────────────────────────
  1919. local function isSelected(petName, rarity)
  1920. for _, e in ipairs(selected) do
  1921. if e.Name == petName and e.Rarity == rarity then return true end
  1922. end
  1923. return false
  1924. end
  1925.  
  1926. local function addSelection(petName, rarity)
  1927. if isSelected(petName, rarity) then return end
  1928. table.insert(selected, { Name = petName, Rarity = rarity })
  1929. elem.Value = selected
  1930. elem:_fire()
  1931. end
  1932.  
  1933. local function removeSelection(petName, rarity)
  1934. for i, e in ipairs(selected) do
  1935. if e.Name == petName and e.Rarity == rarity then
  1936. table.remove(selected, i)
  1937. break
  1938. end
  1939. end
  1940. elem.Value = selected
  1941. elem:_fire()
  1942. end
  1943.  
  1944. -- Rebuild selected chips
  1945. function rebuildChips()
  1946. for _, c in ipairs(chipsScroll:GetChildren()) do
  1947. if c:IsA("Frame") then c:Destroy() end
  1948. end
  1949. for i, entry in ipairs(selected) do
  1950. local chipW = math.max(55, #entry.Name * 5 + 38)
  1951. local chip = New("Frame", {
  1952. BackgroundColor3 = ChipColors[entry.Rarity] or ChipColors.Normal,
  1953. BorderSizePixel = 0,
  1954. Size = UDim2.new(0, chipW, 0, 24),
  1955. LayoutOrder = i,
  1956. ZIndex = 3,
  1957. Parent = chipsScroll,
  1958. })
  1959. AddCorner(chip, 12)
  1960.  
  1961. -- Rarity initial + name
  1962. local rd = RarityDefs[entry.Rarity] or RarityDefs.Normal
  1963. New("TextLabel", {
  1964. BackgroundTransparency = 1,
  1965. Position = UDim2.new(0, 6, 0, 0),
  1966. Size = UDim2.new(1, -22, 1, 0),
  1967. Text = rd.label .. " " .. entry.Name,
  1968. TextColor3 = Color3.new(1, 1, 1),
  1969. TextSize = 10,
  1970. Font = Enum.Font.GothamBold,
  1971. TextTruncate = Enum.TextTruncate.AtEnd,
  1972. ZIndex = 4,
  1973. Parent = chip,
  1974. })
  1975.  
  1976. -- Remove button
  1977. local removeBtn = New("TextButton", {
  1978. BackgroundTransparency = 1,
  1979. AnchorPoint = Vector2.new(1, 0.5),
  1980. Position = UDim2.new(1, -4, 0.5, 0),
  1981. Size = UDim2.new(0, 16, 0, 16),
  1982. Text = "✕",
  1983. TextColor3 = Color3.new(1, 1, 1),
  1984. TextSize = 9,
  1985. Font = Enum.Font.GothamBold,
  1986. ZIndex = 5,
  1987. Parent = chip,
  1988. })
  1989. local capturedName = entry.Name
  1990. local capturedRar = entry.Rarity
  1991. removeBtn.MouseButton1Click:Connect(function()
  1992. removeSelection(capturedName, capturedRar)
  1993. rebuildChips()
  1994. refreshDropButtons()
  1995. end)
  1996. end
  1997. end
  1998.  
  1999. -- Track all active drop-item frames by pet name
  2000. local dropItemFrames = {}
  2001.  
  2002. local function refreshDropButtons()
  2003. for petName, itemFrame in pairs(dropItemFrames) do
  2004. for _, rarity in ipairs(RarityOrder) do
  2005. local btn = itemFrame:FindFirstChild(rarity .. "_Btn")
  2006. if btn then
  2007. local rd = RarityDefs[rarity]
  2008. local active = isSelected(petName, rarity)
  2009. Tween(btn, { BackgroundColor3 = active and rd.active or rd.inactive }, 0.1)
  2010. end
  2011. end
  2012. end
  2013. end
  2014.  
  2015. -- Build dropdown items matching query
  2016. local dropOpen = false
  2017.  
  2018. local function buildDropItems(query)
  2019. -- Clear old
  2020. for _, c in ipairs(dropScroll:GetChildren()) do
  2021. if c:IsA("Frame") then c:Destroy() end
  2022. end
  2023. dropItemFrames = {}
  2024.  
  2025. local q = query:lower()
  2026. local shown = 0
  2027. for _, petName in ipairs(petList) do
  2028. if shown >= maxDrop then break end
  2029. local nameL = petName:lower()
  2030. if q == "" or nameL:find(q, 1, true) then
  2031. shown = shown + 1
  2032.  
  2033. local item = New("Frame", {
  2034. BackgroundColor3 = T.Third,
  2035. Size = UDim2.new(1, 0, 0, ITEM_H),
  2036. ZIndex = 22,
  2037. Parent = dropScroll,
  2038. })
  2039. AddCorner(item, 6)
  2040. HoverEffect(item, T.Third, T.ElementBgHover)
  2041.  
  2042. New("TextLabel", {
  2043. BackgroundTransparency = 1,
  2044. Position = UDim2.new(0, 8, 0, 0),
  2045. Size = UDim2.new(1, -115, 1, 0),
  2046. Text = petName,
  2047. TextColor3 = T.Text,
  2048. TextSize = 11,
  2049. Font = Enum.Font.Gotham,
  2050. TextXAlignment = Enum.TextXAlignment.Left,
  2051. TextTruncate = Enum.TextTruncate.AtEnd,
  2052. ZIndex = 23,
  2053. Parent = item,
  2054. })
  2055.  
  2056. -- [N] [G] [R] buttons
  2057. for bi, rarity in ipairs(RarityOrder) do
  2058. local rd = RarityDefs[rarity]
  2059. local xOffset = -(bi * 36)
  2060. local active = isSelected(petName, rarity)
  2061. local btn = New("TextButton", {
  2062. Name = rarity .. "_Btn",
  2063. BackgroundColor3 = active and rd.active or rd.inactive,
  2064. AnchorPoint = Vector2.new(1, 0.5),
  2065. Position = UDim2.new(1, xOffset, 0.5, 0),
  2066. Size = UDim2.new(0, 30, 0, 22),
  2067. Text = rd.label,
  2068. TextColor3 = Color3.new(1, 1, 1),
  2069. TextSize = 11,
  2070. Font = Enum.Font.GothamBold,
  2071. AutoButtonColor = false,
  2072. ZIndex = 24,
  2073. Parent = item,
  2074. })
  2075. AddCorner(btn, 5)
  2076.  
  2077. local capPet = petName
  2078. local capRar = rarity
  2079. local capBtn = btn
  2080. local capRd = rd
  2081. btn.MouseButton1Click:Connect(function()
  2082. if isSelected(capPet, capRar) then
  2083. removeSelection(capPet, capRar)
  2084. Tween(capBtn, { BackgroundColor3 = capRd.inactive }, 0.1)
  2085. else
  2086. addSelection(capPet, capRar)
  2087. Tween(capBtn, { BackgroundColor3 = capRd.active }, 0.1)
  2088. end
  2089. rebuildChips()
  2090. end)
  2091. end
  2092.  
  2093. dropItemFrames[petName] = item
  2094. end
  2095. end
  2096.  
  2097. -- Size panel
  2098. local targetH = math.min(shown * (ITEM_H + 2) + 10, MAX_DROP_H)
  2099. return shown, targetH
  2100. end
  2101.  
  2102. -- Open/close dropdown
  2103. local function openDropdown()
  2104. local shown, targetH = buildDropItems(searchBox.Text)
  2105. if shown == 0 then return end
  2106. dropPanel.Visible = true
  2107. Tween(dropPanel, { Size = UDim2.new(1, -16, 0, targetH) }, 0.15)
  2108. Tween(root, { Size = UDim2.new(1, 0, 0, BASE_H + targetH + 4) }, 0.15)
  2109. dropOpen = true
  2110. end
  2111.  
  2112. local function closeDropdown()
  2113. if not dropOpen then return end
  2114. dropOpen = false
  2115. Tween(dropPanel, { Size = UDim2.new(1, -16, 0, 0) }, 0.12)
  2116. Tween(root, { Size = UDim2.new(1, 0, 0, BASE_H) }, 0.12)
  2117. task.delay(0.13, function()
  2118. if not dropOpen then dropPanel.Visible = false end
  2119. end)
  2120. end
  2121.  
  2122. searchBox.Focused:Connect(openDropdown)
  2123. searchBox:GetPropertyChangedSignal("Text"):Connect(function()
  2124. if not dropOpen then dropOpen = true end
  2125. local shown, targetH = buildDropItems(searchBox.Text)
  2126. if shown == 0 then
  2127. closeDropdown()
  2128. return
  2129. end
  2130. dropPanel.Visible = true
  2131. dropPanel.Size = UDim2.new(1, -16, 0, targetH)
  2132. root.Size = UDim2.new(1, 0, 0, BASE_H + targetH + 4)
  2133. end)
  2134.  
  2135. UserInputService.InputBegan:Connect(function(input)
  2136. if input.UserInputType == Enum.UserInputType.MouseButton1 and dropOpen then
  2137. local pos = input.Position
  2138. local rp = root.AbsolutePosition
  2139. local rs = root.AbsoluteSize
  2140. local inside = pos.X >= rp.X and pos.X <= rp.X + rs.X
  2141. and pos.Y >= rp.Y and pos.Y <= rp.Y + rs.Y + 200
  2142. if not inside then closeDropdown() end
  2143. end
  2144. end)
  2145.  
  2146. root.Parent = parent
  2147. rebuildChips()
  2148. return elem
  2149. end
  2150.  
  2151. -- ─────────────────────────────────────────────────────────────────────────
  2152. -- TABS
  2153. -- ─────────────────────────────────────────────────────────────────────────
  2154. local tabButtonRefs = {}
  2155.  
  2156. function Window:AddTab(options)
  2157. options = options or {}
  2158. local tabTitle = options.Title or "Tab"
  2159. local tabIcon = options.Icon or ""
  2160.  
  2161. Window.TabCount = Window.TabCount + 1
  2162. local tabIdx = Window.TabCount
  2163.  
  2164. -- Tab button in sidebar
  2165. local tabBtn = New("TextButton", {
  2166. BackgroundColor3 = T.TabButtonBg,
  2167. Size = UDim2.new(1, 0, 0, 36),
  2168. Text = "",
  2169. AutoButtonColor = false,
  2170. LayoutOrder = tabIdx,
  2171. Parent = sidebar,
  2172. })
  2173. AddCorner(tabBtn, 8)
  2174. tabButtonRefs[tabIdx] = tabBtn
  2175.  
  2176. New("TextLabel", {
  2177. BackgroundTransparency = 1,
  2178. Position = UDim2.new(0, 10, 0, 0),
  2179. Size = UDim2.new(1, -10, 1, 0),
  2180. Text = tabTitle,
  2181. TextColor3 = T.SubText,
  2182. TextSize = 12,
  2183. Font = Enum.Font.Gotham,
  2184. TextXAlignment = Enum.TextXAlignment.Left,
  2185. Parent = tabBtn,
  2186. })
  2187.  
  2188. -- Tab content frame
  2189. local tabFrame = New("ScrollingFrame", {
  2190. Name = "Tab_" .. tabTitle,
  2191. BackgroundTransparency = 1,
  2192. BorderSizePixel = 0,
  2193. Size = UDim2.new(1, 0, 1, 0),
  2194. CanvasSize = UDim2.new(0, 0, 0, 0),
  2195. AutomaticCanvasSize = Enum.AutomaticSize.Y,
  2196. ScrollBarThickness = 4,
  2197. ScrollBarImageColor3 = T.ElementStroke,
  2198. Visible = tabIdx == 1,
  2199. Parent = contentArea,
  2200. })
  2201. AddList(tabFrame, 6)
  2202. AddPadding(tabFrame, 10, 10, 10, 10)
  2203.  
  2204. -- Set first tab active
  2205. if tabIdx == 1 then
  2206. Window.ActiveTab = tabFrame
  2207. tabBtn.BackgroundColor3 = T.TabButtonActive
  2208. tabBtn:FindFirstChildWhichIsA("TextLabel").TextColor3 = T.Text
  2209. end
  2210.  
  2211. -- Switch to this tab
  2212. tabBtn.MouseButton1Click:Connect(function()
  2213. -- Hide all tabs
  2214. for _, frame in ipairs(contentArea:GetChildren()) do
  2215. if frame:IsA("ScrollingFrame") then frame.Visible = false end
  2216. end
  2217. -- Unhighlight all buttons
  2218. for _, btn in pairs(tabButtonRefs) do
  2219. Tween(btn, { BackgroundColor3 = T.TabButtonBg }, 0.1)
  2220. local lbl = btn:FindFirstChildWhichIsA("TextLabel")
  2221. if lbl then lbl.TextColor3 = T.SubText end
  2222. end
  2223. -- Show this tab
  2224. tabFrame.Visible = true
  2225. Window.ActiveTab = tabFrame
  2226. Tween(tabBtn, { BackgroundColor3 = T.TabButtonActive }, 0.1)
  2227. tabBtn:FindFirstChildWhichIsA("TextLabel").TextColor3 = T.Text
  2228. end)
  2229.  
  2230. HoverEffect(tabBtn, T.TabButtonBg, T.TabButtonHover)
  2231.  
  2232. -- ── Tab API ────────────────────────────────────────────────────────
  2233. local Tab = {}
  2234.  
  2235. function Tab:AddSection(sname)
  2236. BuildSection(tabFrame, sname)
  2237. end
  2238. function Tab:AddToggle(sid, sopts)
  2239. return BuildToggle(tabFrame, sid, sopts)
  2240. end
  2241. function Tab:AddSlider(sid, sopts)
  2242. return BuildSlider(tabFrame, sid, sopts)
  2243. end
  2244. function Tab:AddDropdown(sid, sopts)
  2245. return BuildDropdown(tabFrame, sid, sopts)
  2246. end
  2247. function Tab:AddButton(sopts)
  2248. return BuildButton(tabFrame, sopts)
  2249. end
  2250. function Tab:AddTextbox(sid, sopts)
  2251. return BuildTextbox(tabFrame, sid, sopts)
  2252. end
  2253. function Tab:AddKeybind(sid, sopts)
  2254. return BuildKeybind(tabFrame, sid, sopts)
  2255. end
  2256. function Tab:AddColorpicker(sid, sopts)
  2257. return BuildColorpicker(tabFrame, sid, sopts)
  2258. end
  2259. function Tab:AddLabel(text, color)
  2260. return BuildLabel(tabFrame, text, color)
  2261. end
  2262. -- NEW: Collapsible section
  2263. function Tab:AddCollapsibleSection(sname)
  2264. return BuildCollapsibleSection(tabFrame, sname)
  2265. end
  2266. -- NEW: Pet Picker
  2267. function Tab:AddPetPicker(sid, sopts)
  2268. return BuildPetPicker(tabFrame, sid, sopts)
  2269. end
  2270.  
  2271. table.insert(Window.Tabs, Tab)
  2272. return Tab
  2273. end
  2274.  
  2275. function Window:SelectTab(index)
  2276. local btn = tabButtonRefs[index]
  2277. if btn then btn:Invoke() end
  2278. for _, frame in ipairs(contentArea:GetChildren()) do
  2279. if frame:IsA("ScrollingFrame") then
  2280. frame.Visible = frame.Name == ("Tab_" .. (Window.Tabs[index] and "" or ""))
  2281. end
  2282. end
  2283. -- Simple: click the button
  2284. if btn then
  2285. -- Simulate click
  2286. for _, frame in ipairs(contentArea:GetChildren()) do
  2287. if frame:IsA("ScrollingFrame") then frame.Visible = false end
  2288. end
  2289. for i, b in pairs(tabButtonRefs) do
  2290. Tween(b, { BackgroundColor3 = i == index and T.TabButtonActive or T.TabButtonBg }, 0.1)
  2291. local lbl = b:FindFirstChildWhichIsA("TextLabel")
  2292. if lbl then lbl.TextColor3 = i == index and T.Text or T.SubText end
  2293. end
  2294. local frames = contentArea:GetChildren()
  2295. if frames[index] then frames[index].Visible = true end
  2296. end
  2297. end
  2298.  
  2299. -- Clean up blur on GUI destroy
  2300. gui.AncestryChanged:Connect(function()
  2301. if not gui.Parent then
  2302. if blur then pcall(function() blur:Destroy() end) end
  2303. end
  2304. end)
  2305.  
  2306. return Window
  2307. end
  2308.  
  2309. return Fluent
  2310.  
Advertisement
Add Comment
Please, Sign In to add comment