1.1: CSS Modulization - Create 8 modular CSS files

- base.css: Foundation styles, typography, resets
- components.css: Buttons, cards, badges, alerts, modals
- forms.css: Input fields, validation, checkboxes, radio
- tables.css: Table styles, responsive, pagination
- layout.css: Header, sidebar, navigation, grid
- darkmode.css: Dark theme variables and overrides
- responsive.css: Mobile-first, breakpoints, grid columns
- utilities.css: Spacing, colors, text, helpers

All files support Bootstrap 5 + SmartAdmin theme
- Total CSS: ~1800 lines (organized, maintainable)
- Supports dark mode via data-bs-theme="dark"
- Mobile-first responsive design
- Preserved smartapp.min.css for legacy compatibility

Load order:
1. base → components → forms → tables → layout
2. darkmode → responsive → utilities
3. smartapp.min.css (fallback)

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-05 15:53:56 +09:00
parent d12dee3278
commit 0d81ace5da
10 changed files with 3214 additions and 0 deletions
+398
View File
@@ -0,0 +1,398 @@
/* ============================================================
SmartAdmin Bootstrap 5 - Forms
CSS Module: Input Fields, Validation, Checkboxes, Radio
============================================================ */
/* Form Controls */
.form-control,
.form-select,
.form-range {
display: block;
width: 100%;
padding: 0.5rem 0.75rem;
font-size: 0.9375rem;
font-weight: 400;
line-height: 1.5;
color: var(--bs-body-color);
background-color: var(--bs-body-bg);
background-clip: padding-box;
border: 1px solid var(--bs-gray-300);
border-radius: var(--bs-border-radius);
transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
}
.form-control:focus,
.form-select:focus {
color: var(--bs-body-color);
background-color: var(--bs-body-bg);
border-color: var(--bs-primary);
outline: 0;
box-shadow: 0 0 0 0.2rem rgba(33, 150, 243, 0.25);
}
.form-control:disabled,
.form-select:disabled {
background-color: var(--bs-gray-100);
opacity: 1;
cursor: not-allowed;
}
.form-control::placeholder {
color: var(--bs-gray-500);
opacity: 1;
}
/* Form Sizes */
.form-control-sm {
min-height: calc(1.5em + 0.5rem + 2px);
padding: 0.25rem 0.5rem;
font-size: 0.875rem;
border-radius: var(--bs-border-radius);
}
.form-control-lg {
min-height: calc(1.5em + 1rem + 2px);
padding: 0.75rem 1rem;
font-size: 1.25rem;
border-radius: var(--bs-border-radius-lg);
}
/* Textarea */
textarea.form-control {
min-height: 5rem;
resize: vertical;
}
textarea.form-control-sm {
min-height: 2.5rem;
}
textarea.form-control-lg {
min-height: 7.5rem;
}
/* Select */
.form-select {
padding-right: 4.125rem;
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");
background-repeat: no-repeat;
background-position: right 0.75rem center;
background-size: 16px 12px;
}
.form-select:focus {
border-color: var(--bs-primary);
box-shadow: 0 0 0 0.2rem rgba(33, 150, 243, 0.25);
}
/* Form Groups */
.form-group {
margin-bottom: 1rem;
}
.form-group label {
display: block;
margin-bottom: 0.5rem;
font-weight: 500;
color: inherit;
}
.form-group label.required::after {
content: " *";
color: var(--bs-danger);
}
.form-group small {
display: block;
margin-top: 0.25rem;
color: var(--bs-gray-600);
font-size: 0.875rem;
}
/* Form Row */
.form-row {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 1rem;
}
.form-row.row {
display: flex;
flex-wrap: wrap;
margin-right: -0.5rem;
margin-left: -0.5rem;
}
.form-row .col {
padding-right: 0.5rem;
padding-left: 0.5rem;
}
/* Input Groups */
.input-group {
position: relative;
display: flex;
flex-wrap: wrap;
align-items: stretch;
width: 100%;
}
.input-group > .form-control,
.input-group > .form-select {
position: relative;
flex: 1 1 auto;
width: 1%;
min-width: 0;
}
.input-group-text {
display: flex;
align-items: center;
padding: 0.5rem 0.75rem;
margin-bottom: 0;
font-size: 1rem;
font-weight: 400;
line-height: 1.5;
color: var(--bs-body-color);
text-align: center;
white-space: nowrap;
background-color: var(--bs-gray-100);
border: 1px solid var(--bs-gray-300);
border-radius: var(--bs-border-radius);
}
[data-bs-theme="dark"] .input-group-text {
background-color: var(--bs-gray-700);
border-color: var(--bs-gray-600);
}
.input-group-prepend {
display: flex;
margin-right: -1px;
}
.input-group-append {
display: flex;
margin-left: -1px;
}
.input-group-prepend .btn,
.input-group-prepend .input-group-text,
.input-group-append .btn,
.input-group-append .input-group-text {
border-radius: var(--bs-border-radius);
}
/* Checkboxes & Radio Buttons */
.form-check {
display: block;
min-height: 1.5rem;
padding-left: 1.5rem;
margin-bottom: 0.125rem;
}
.form-check-input {
float: left;
margin-left: -1.5rem;
margin-top: 0.3em;
accent-color: var(--bs-primary);
cursor: pointer;
width: 1rem;
height: 1rem;
border: 1px solid var(--bs-gray-300);
border-radius: 0.25em;
appearance: none;
background-color: var(--bs-body-bg);
background-image: none;
background-repeat: no-repeat;
background-position: center;
background-size: contain;
border-color: var(--bs-gray-300);
transition: border-color 0.15s ease-in-out, background-color 0.15s ease-in-out;
}
.form-check-input:checked {
background-color: var(--bs-primary);
border-color: var(--bs-primary);
}
.form-check-input:checked::after {
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10l3 3l6-6'/%3e%3c/svg%3e");
}
.form-check-input:focus {
border-color: var(--bs-primary);
outline: 0;
box-shadow: 0 0 0 0.2rem rgba(33, 150, 243, 0.25);
}
.form-check-input:disabled {
pointer-events: none;
filter: none;
opacity: 0.5;
}
.form-check-label {
margin-bottom: 0;
cursor: pointer;
}
.form-check-inline {
display: inline-block;
margin-right: 1rem;
}
/* Radio */
.form-check-input[type="radio"] {
border-radius: 50%;
}
/* Switch */
.form-switch .form-check-input {
width: 2.5em;
margin-left: -2.5em;
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3cpath stroke='%23fff' d='M-3 0a3 3 0 0 0 6 0'/%3e%3c/svg%3e");
background-position: left center;
border-radius: 2em;
transition: background-position 0.15s ease-in-out;
}
.form-switch .form-check-input:checked {
background-position: right center;
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3cpath stroke='%23fff' d='M3 0a3 3 0 0 0-6 0'/%3e%3c/svg%3e");
}
/* Validation States */
.form-control.is-valid,
.form-select.is-valid {
border-color: var(--bs-success);
}
.form-control.is-valid:focus,
.form-select.is-valid:focus {
border-color: var(--bs-success);
box-shadow: 0 0 0 0.2rem rgba(76, 175, 80, 0.25);
}
.form-control.is-invalid,
.form-select.is-invalid {
border-color: var(--bs-danger);
}
.form-control.is-invalid:focus,
.form-select.is-invalid:focus {
border-color: var(--bs-danger);
box-shadow: 0 0 0 0.2rem rgba(244, 67, 54, 0.25);
}
.valid-feedback,
.invalid-feedback {
display: block;
margin-top: 0.25rem;
font-size: 0.875rem;
font-weight: 500;
}
.valid-feedback {
color: var(--bs-success);
}
.invalid-feedback {
color: var(--bs-danger);
}
.was-validated .form-control:invalid ~ .invalid-feedback,
.form-control.is-invalid ~ .invalid-feedback {
display: block;
}
.was-validated .form-control:valid ~ .valid-feedback,
.form-control.is-valid ~ .valid-feedback {
display: block;
}
/* Fieldset */
fieldset {
min-width: 0;
padding: 0;
margin: 0;
border: 0;
}
legend {
float: left;
width: 100%;
padding: 0;
margin-bottom: 0.5rem;
font-size: 1.25rem;
font-weight: 600;
line-height: inherit;
color: inherit;
}
/* Range Input */
.form-range {
width: 100%;
height: 1.5rem;
padding: 0;
background-color: transparent;
appearance: none;
-webkit-appearance: none;
-moz-appearance: none;
}
.form-range::-webkit-slider-thumb {
width: 1.25rem;
height: 1.25rem;
appearance: none;
-webkit-appearance: none;
background: var(--bs-primary);
border: 0;
border-radius: 50%;
cursor: pointer;
transition: background-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
}
.form-range::-webkit-slider-thumb:active {
background-color: #90caf9;
box-shadow: 0 0 0 0.5rem rgba(33, 150, 243, 0.25);
}
.form-range::-webkit-slider-runnable-track {
width: 100%;
height: 0.5rem;
color: transparent;
cursor: pointer;
background-color: var(--bs-gray-300);
border-color: transparent;
border-radius: 1rem;
}
.form-range::-moz-range-thumb {
width: 1.25rem;
height: 1.25rem;
background: var(--bs-primary);
border: 0;
border-radius: 50%;
cursor: pointer;
transition: background-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
}
.form-range::-moz-range-thumb:active {
background-color: #90caf9;
box-shadow: 0 0 0 0.5rem rgba(33, 150, 243, 0.25);
}
.form-range::-moz-range-track {
background-color: transparent;
border-color: transparent;
}
.form-range::-moz-range-progress {
background-color: var(--bs-primary);
border-radius: 1rem;
height: 0.5rem;
}