From fed7b5ae50488faa4c0f13514003aafc2d59bc45 Mon Sep 17 00:00:00 2001 From: Justin Edmund Date: Tue, 16 Sep 2025 20:08:57 -0700 Subject: [PATCH] implement visual party segmented control --- messages/en.json | 6 +- messages/ja.json | 6 +- .../party/PartySegmentedControl.svelte | 89 +++++++++++++++++++ .../ui/segmented-control/RepSegment.svelte | 42 +++++++++ .../segmented-control/rep-segment.module.scss | 81 +++++++++++++++++ src/lib/types/enums.ts | 27 ++++++ 6 files changed, 249 insertions(+), 2 deletions(-) create mode 100644 src/lib/components/party/PartySegmentedControl.svelte create mode 100644 src/lib/components/ui/segmented-control/RepSegment.svelte create mode 100644 src/lib/components/ui/segmented-control/rep-segment.module.scss create mode 100644 src/lib/types/enums.ts diff --git a/messages/en.json b/messages/en.json index 944356eb..0db8d311 100644 --- a/messages/en.json +++ b/messages/en.json @@ -8,5 +8,9 @@ "nav_settings": "Settings", "nav_logout": "Log out", "nav_account_aria": "Your account", - "nav_menu_button": "Menu" + "nav_menu_button": "Menu", + + "party_segmented_control_characters": "Characters", + "party_segmented_control_weapons": "Weapons", + "party_segmented_control_summons": "Summons" } diff --git a/messages/ja.json b/messages/ja.json index cc91d426..fe41a29c 100644 --- a/messages/ja.json +++ b/messages/ja.json @@ -8,5 +8,9 @@ "nav_settings": "設定", "nav_logout": "ログアウト", "nav_account_aria": "アカウント", - "nav_menu_button": "メニュー" + "nav_menu_button": "メニュー", + + "party_segmented_control_characters": "キャラ", + "party_segmented_control_weapons": "武器", + "party_segmented_control_summons": "召喚石" } diff --git a/src/lib/components/party/PartySegmentedControl.svelte b/src/lib/components/party/PartySegmentedControl.svelte new file mode 100644 index 00000000..b5becb88 --- /dev/null +++ b/src/lib/components/party/PartySegmentedControl.svelte @@ -0,0 +1,89 @@ + + + + + + \ No newline at end of file diff --git a/src/lib/components/ui/segmented-control/RepSegment.svelte b/src/lib/components/ui/segmented-control/RepSegment.svelte new file mode 100644 index 00000000..3ad80787 --- /dev/null +++ b/src/lib/components/ui/segmented-control/RepSegment.svelte @@ -0,0 +1,42 @@ + + + + + + + {#snippet children({ checked })} + {#if checked} +
+ {/if} +
+
+ {@render content?.()} +
+
{label}
+
+ {/snippet} +
diff --git a/src/lib/components/ui/segmented-control/rep-segment.module.scss b/src/lib/components/ui/segmented-control/rep-segment.module.scss new file mode 100644 index 00000000..e5f3b83c --- /dev/null +++ b/src/lib/components/ui/segmented-control/rep-segment.module.scss @@ -0,0 +1,81 @@ +@use '$src/themes/spacing' as *; +@use '$src/themes/layout' as *; +@use '$src/themes/colors' as *; +@use '$src/themes/typography' as *; + +.repSegment { + position: relative; + flex: 1; + min-width: 0; + padding: 0; + background: transparent; + border: none; + border-radius: $item-corner; + cursor: pointer; + transition: all 0.2s ease; + + &:hover { + background: $grey-80; // Solid gray for hover state + } + + &:focus-visible { + outline: 2px solid var(--focus-ring); + outline-offset: 2px; + } + + &.selected .wrapper, + &:hover .wrapper { + opacity: 1; + } + + &:hover .label { + color: var(--text-primary); + } +} + +.indicator { + position: absolute; + inset: 0; + background: $grey-80; + border-radius: $item-corner; + opacity: 0; + transition: opacity 0.2s ease; + + [data-state='checked'] & { + opacity: 1; + } +} + +.wrapper { + position: relative; + display: flex; + flex-direction: column; + align-items: center; + gap: $unit; + padding: $unit; + opacity: 0.7; + transition: opacity 0.2s ease; + + [data-state='checked'] & { + opacity: 1; + } +} + +.content { + width: 100%; + min-height: 60px; + display: flex; + align-items: center; + justify-content: center; +} + +.label { + font-size: $font-small; + font-weight: $medium; + color: var(--text-secondary); + white-space: nowrap; + + [data-state='checked'] & { + color: var(--text-primary); + } +} diff --git a/src/lib/types/enums.ts b/src/lib/types/enums.ts new file mode 100644 index 00000000..837fdb88 --- /dev/null +++ b/src/lib/types/enums.ts @@ -0,0 +1,27 @@ +export enum GridType { + Character = 'character', + Weapon = 'weapon', + Summon = 'summon' +} + +export enum TeamElement { + Any = 0, + Wind = 1, + Fire = 2, + Water = 3, + Earth = 4, + Dark = 5, + Light = 6 +} + +export function getElementClass(element: number): string | null { + switch (element) { + case TeamElement.Wind: return 'wind' + case TeamElement.Fire: return 'fire' + case TeamElement.Water: return 'water' + case TeamElement.Earth: return 'earth' + case TeamElement.Dark: return 'dark' + case TeamElement.Light: return 'light' + default: return null + } +} \ No newline at end of file