| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 |
- @tailwind base;
- @tailwind components;
- @tailwind utilities;
- @layer base {
- /* Hide native spinner buttons on every number input app-wide. The
- team prefers keyboard typing over the tiny, inconsistent UA
- controls. */
- input[type="number"]::-webkit-outer-spin-button,
- input[type="number"]::-webkit-inner-spin-button {
- -webkit-appearance: none;
- margin: 0;
- }
- input[type="number"] {
- -moz-appearance: textfield;
- appearance: textfield;
- }
- }
- @layer utilities {
- /* Phase 13: the Focus filter temporarily hides entire sw columns when the
- focused worker has no assignment on any visible row. Separate from the
- .hidden set driven by the Columns dropdown so clearing Focus restores
- the user's manual column picks. */
- .focus-auto-hidden {
- display: none;
- }
- }
- @layer components {
- /* Phase 15: big-screen / beamer presentation scope. Applied via
- views/sprints/present.php on the root <main>. Tightens typography
- and cell padding so the task table fits the viewport without
- horizontal scroll at 1920×1080; hides drag handles and per-row
- delete buttons (not meaningful during a group discussion). */
- .beamer-root table {
- table-layout: fixed;
- font-size: clamp(0.75rem, 0.95vw, 1.05rem);
- }
- .beamer-root td,
- .beamer-root th {
- padding: 0.25rem 0.35rem;
- }
- .beamer-root .handle,
- .beamer-root [data-delete-task] {
- display: none;
- }
- /* JS-driven toggle (sprint-planner.js): when the rendered task table
- is wider than the viewport, rotate worker-column headers to save
- horizontal space. Leaves non-worker headers (Task / Owner / Prio
- / Tot) untouched. */
- .beamer-vertical-headers thead th[data-sort-col^="sw-"] {
- writing-mode: vertical-rl;
- transform: rotate(180deg);
- padding: 0.5rem 0.25rem;
- }
- /* Phase 18: per-cell task-assignment status. The colour class lives
- on the <td> (so JS / filters can read data-status off the cell),
- but the visible tint is applied to the day input / read-only span
- inside — colouring just the <td> made the cell padding stripe a
- different colour from the field, which read as visual noise. The
- four .assign-status-* class names are interpolated server-side
- ("assign-status-<?= $st ?>"), so they're held in
- tailwind.config.js's safelist; otherwise the JIT prunes them. */
- .assign-status-zugewiesen { /* default: no tint */ }
- .assign-status-gestartet input[data-assign],
- .assign-status-gestartet > span.font-mono { background-color: theme('colors.yellow.200'); }
- .assign-status-abgeschlossen input[data-assign],
- .assign-status-abgeschlossen > span.font-mono { background-color: theme('colors.green.200'); }
- .assign-status-abgebrochen input[data-assign],
- .assign-status-abgebrochen > span.font-mono { background-color: theme('colors.red.200'); }
- .dark .assign-status-gestartet input[data-assign],
- .dark .assign-status-gestartet > span.font-mono { background-color: theme('colors.yellow.700'); }
- .dark .assign-status-abgeschlossen input[data-assign],
- .dark .assign-status-abgeschlossen > span.font-mono { background-color: theme('colors.green.700'); }
- .dark .assign-status-abgebrochen input[data-assign],
- .dark .assign-status-abgebrochen > span.font-mono { background-color: theme('colors.red.700'); }
- /* Cell popover — replaces the per-cell chevron status select.
- Body-attached, position: absolute (set in JS), shown to the
- right of the bound input/cell. Carries a 0..N slider (max
- configured via /settings → assignment_slider_max) and a
- column of status pills with coloured bullets. */
- .cell-popover {
- position: absolute;
- z-index: 50;
- min-width: 18rem;
- padding: 0.75rem;
- border-radius: 0.5rem;
- border: 1px solid theme('colors.slate.200');
- background-color: theme('colors.white');
- box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
- }
- .dark .cell-popover {
- border-color: theme('colors.slate.700');
- background-color: theme('colors.slate.800');
- }
- .cell-popover-grid {
- display: grid;
- grid-template-columns: 1fr auto;
- gap: 1rem;
- align-items: center;
- }
- .cell-popover-slider {
- display: flex;
- flex-direction: column;
- gap: 0.4rem;
- min-width: 8rem;
- }
- .cell-popover-slider input[type="range"] {
- width: 100%;
- accent-color: theme('colors.slate.600');
- cursor: pointer;
- }
- .dark .cell-popover-slider input[type="range"] {
- accent-color: theme('colors.slate.400');
- }
- .cell-popover-value {
- text-align: center;
- font-family: theme('fontFamily.mono');
- font-size: 0.875rem;
- color: theme('colors.slate.700');
- }
- .dark .cell-popover-value {
- color: theme('colors.slate.200');
- }
- .cell-popover-status {
- display: flex;
- flex-direction: column;
- gap: 0.25rem;
- min-width: 9rem;
- }
- .cell-popover-status-btn {
- display: flex;
- align-items: center;
- gap: 0.5rem;
- padding: 0.25rem 0.5rem;
- border-radius: 4px;
- text-align: left;
- font-size: 0.875rem;
- color: theme('colors.slate.700');
- background-color: transparent;
- border: 1px solid transparent;
- cursor: pointer;
- }
- .dark .cell-popover-status-btn {
- color: theme('colors.slate.200');
- }
- .cell-popover-status-btn:hover {
- background-color: theme('colors.slate.100');
- }
- .dark .cell-popover-status-btn:hover {
- background-color: theme('colors.slate.700');
- }
- .cell-popover-status-btn.cell-popover-active {
- border-color: theme('colors.slate.300');
- background-color: theme('colors.slate.50');
- }
- .dark .cell-popover-status-btn.cell-popover-active {
- border-color: theme('colors.slate.600');
- background-color: theme('colors.slate.700');
- }
- .cell-popover-bullet {
- display: inline-block;
- width: 0.75rem;
- height: 0.75rem;
- border-radius: 9999px;
- flex-shrink: 0;
- }
- .cell-popover-bullet.bullet-zugewiesen {
- border: 1px solid theme('colors.slate.300');
- }
- .dark .cell-popover-bullet.bullet-zugewiesen {
- border-color: theme('colors.slate.600');
- }
- .cell-popover-bullet.bullet-gestartet { background-color: theme('colors.yellow.300'); }
- .cell-popover-bullet.bullet-abgeschlossen { background-color: theme('colors.green.300'); }
- .cell-popover-bullet.bullet-abgebrochen { background-color: theme('colors.red.300'); }
- .dark .cell-popover-bullet.bullet-gestartet { background-color: theme('colors.yellow.500'); }
- .dark .cell-popover-bullet.bullet-abgeschlossen { background-color: theme('colors.green.500'); }
- .dark .cell-popover-bullet.bullet-abgebrochen { background-color: theme('colors.red.500'); }
- }
|