From 4fccef6616e29f6008bac61eca6531e02edee46d Mon Sep 17 00:00:00 2001 From: Richard Ward Date: Tue, 30 Dec 2025 18:27:37 +0000 Subject: [PATCH] update: scss,nextjs,module (9 files) --- .../molecules/form/FormField.module.scss | 64 +++++++++++++++++++ .../molecules/form/NumberField.module.scss | 12 ++++ .../molecules/form/SearchBar.module.scss | 28 ++++++++ .../molecules/form/Select.module.scss | 28 ++++++++ .../molecules/form/SelectLabel.module.scss | 6 ++ .../form/SelectSeparator.module.scss | 4 ++ .../molecules/form/SelectTrigger.module.scss | 19 ++++++ .../molecules/form/SelectValue.module.scss | 9 +++ .../molecules/form/Tabs.module.scss | 30 +++++++++ 9 files changed, 200 insertions(+) create mode 100644 frontends/nextjs/src/components/molecules/form/FormField.module.scss create mode 100644 frontends/nextjs/src/components/molecules/form/NumberField.module.scss create mode 100644 frontends/nextjs/src/components/molecules/form/SearchBar.module.scss create mode 100644 frontends/nextjs/src/components/molecules/form/Select.module.scss create mode 100644 frontends/nextjs/src/components/molecules/form/SelectLabel.module.scss create mode 100644 frontends/nextjs/src/components/molecules/form/SelectSeparator.module.scss create mode 100644 frontends/nextjs/src/components/molecules/form/SelectTrigger.module.scss create mode 100644 frontends/nextjs/src/components/molecules/form/SelectValue.module.scss create mode 100644 frontends/nextjs/src/components/molecules/form/Tabs.module.scss diff --git a/frontends/nextjs/src/components/molecules/form/FormField.module.scss b/frontends/nextjs/src/components/molecules/form/FormField.module.scss new file mode 100644 index 000000000..52c3af56f --- /dev/null +++ b/frontends/nextjs/src/components/molecules/form/FormField.module.scss @@ -0,0 +1,64 @@ +.formField { + display: flex; + flex-direction: column; + gap: 4px; +} + +.helperText { + font-size: 0.75rem; + color: var(--text-secondary, #666); + + &.error { + color: var(--error-main, #d32f2f); + } +} + +.searchInput { + border-radius: 4px; +} + +.searchIcon { + color: rgba(0, 0, 0, 0.54); +} + +.textarea { + width: auto; + min-height: 80px; + padding: 8px 12px; + font-size: 0.875rem; + font-family: inherit; + border: 1px solid var(--divider, rgba(0, 0, 0, 0.12)); + border-radius: 4px; + background-color: var(--background-paper, #fff); + resize: vertical; + transition: border-color 0.2s, box-shadow 0.2s; + + &:hover { + border-color: var(--text-secondary, #666); + } + + &:focus { + outline: none; + border-color: var(--primary-main, #1976d2); + box-shadow: 0 0 0 2px rgba(25, 118, 210, 0.15); + } + + &:disabled { + opacity: 0.5; + cursor: not-allowed; + } + + &.error { + border-color: var(--error-main, #d32f2f); + + &:hover, + &:focus { + border-color: var(--error-main, #d32f2f); + box-shadow: 0 0 0 2px rgba(211, 47, 47, 0.15); + } + } + + &.fullWidth { + width: 100%; + } +} diff --git a/frontends/nextjs/src/components/molecules/form/NumberField.module.scss b/frontends/nextjs/src/components/molecules/form/NumberField.module.scss new file mode 100644 index 000000000..3891803e1 --- /dev/null +++ b/frontends/nextjs/src/components/molecules/form/NumberField.module.scss @@ -0,0 +1,12 @@ +.numberField { + // Hide number input spinners + input[type='number'] { + -moz-appearance: textfield; + + &::-webkit-outer-spin-button, + &::-webkit-inner-spin-button { + -webkit-appearance: none; + margin: 0; + } + } +} diff --git a/frontends/nextjs/src/components/molecules/form/SearchBar.module.scss b/frontends/nextjs/src/components/molecules/form/SearchBar.module.scss new file mode 100644 index 000000000..83eb48240 --- /dev/null +++ b/frontends/nextjs/src/components/molecules/form/SearchBar.module.scss @@ -0,0 +1,28 @@ +.searchBar { + border-radius: 8px; + background-color: var(--background-paper, #fff); + transition: box-shadow 0.2s; + + &:hover { + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12); + } + + &:focus-within { + box-shadow: 0 2px 6px rgba(0, 0, 0, 0.15); + } +} + +.searchIcon { + color: rgba(0, 0, 0, 0.54); +} + +.endAdornments { + display: flex; + gap: 4px; + align-items: center; +} + +.clearButton, +.filterButton { + padding: 4px; +} diff --git a/frontends/nextjs/src/components/molecules/form/Select.module.scss b/frontends/nextjs/src/components/molecules/form/Select.module.scss new file mode 100644 index 000000000..736de964d --- /dev/null +++ b/frontends/nextjs/src/components/molecules/form/Select.module.scss @@ -0,0 +1,28 @@ +.selectWrapper { + display: flex; + flex-direction: column; + gap: 4px; + + &.fullWidth { + width: 100%; + } +} + +.selectContainer { + position: relative; + display: inline-flex; + align-items: center; +} + +.select { + appearance: none; + width: 100%; + padding-right: 32px; +} + +.icon { + position: absolute; + right: 8px; + pointer-events: none; + color: rgba(0, 0, 0, 0.54); +} diff --git a/frontends/nextjs/src/components/molecules/form/SelectLabel.module.scss b/frontends/nextjs/src/components/molecules/form/SelectLabel.module.scss new file mode 100644 index 000000000..e247be6e6 --- /dev/null +++ b/frontends/nextjs/src/components/molecules/form/SelectLabel.module.scss @@ -0,0 +1,6 @@ +.selectLabel { + padding: 8px 16px; + font-size: 0.75rem; + font-weight: 600; + color: var(--text-secondary, #666); +} diff --git a/frontends/nextjs/src/components/molecules/form/SelectSeparator.module.scss b/frontends/nextjs/src/components/molecules/form/SelectSeparator.module.scss new file mode 100644 index 000000000..9828df497 --- /dev/null +++ b/frontends/nextjs/src/components/molecules/form/SelectSeparator.module.scss @@ -0,0 +1,4 @@ +.selectSeparator { + margin: 4px 0; + border-color: var(--divider, rgba(0, 0, 0, 0.12)); +} diff --git a/frontends/nextjs/src/components/molecules/form/SelectTrigger.module.scss b/frontends/nextjs/src/components/molecules/form/SelectTrigger.module.scss new file mode 100644 index 000000000..6a56b87d8 --- /dev/null +++ b/frontends/nextjs/src/components/molecules/form/SelectTrigger.module.scss @@ -0,0 +1,19 @@ +.selectTrigger { + display: flex; + align-items: center; + justify-content: space-between; + padding: 8px 12px; + border: 1px solid var(--divider, rgba(0, 0, 0, 0.12)); + border-radius: 4px; + cursor: pointer; + transition: border-color 0.2s; + + &:hover { + border-color: var(--text-secondary, #666); + } +} + +.icon { + margin-left: 4px; + color: rgba(0, 0, 0, 0.54); +} diff --git a/frontends/nextjs/src/components/molecules/form/SelectValue.module.scss b/frontends/nextjs/src/components/molecules/form/SelectValue.module.scss new file mode 100644 index 000000000..a6ad2937d --- /dev/null +++ b/frontends/nextjs/src/components/molecules/form/SelectValue.module.scss @@ -0,0 +1,9 @@ +.selectValue { + &.hasValue { + color: var(--text-primary, rgba(0, 0, 0, 0.87)); + } + + &.placeholder { + color: var(--text-secondary, #666); + } +} diff --git a/frontends/nextjs/src/components/molecules/form/Tabs.module.scss b/frontends/nextjs/src/components/molecules/form/Tabs.module.scss new file mode 100644 index 000000000..31088a2e7 --- /dev/null +++ b/frontends/nextjs/src/components/molecules/form/Tabs.module.scss @@ -0,0 +1,30 @@ +.tabsWrapper { + // Container for tabs +} + +.tabs { + // Tabs container styling +} + +.tabsList { + display: inline-flex; + background-color: var(--action-hover, rgba(0, 0, 0, 0.04)); + border-radius: 4px; + padding: 4px; +} + +.tabTrigger { + min-height: 36px; + padding: 8px 24px; + text-transform: none; + font-weight: 500; + border-radius: 2px; + + &.tab--active { + background-color: var(--background-paper, #fff); + } +} + +.tabContent { + padding-top: 16px; +}