Merge pull request #650 from Oloodi/616-implement-shimmer-loading-in-mobile-applications-fe
616 implement shimmer loading in mobile applications fe
@@ -37,6 +37,7 @@ Before any design work, ensure you have loaded:
|
|||||||
- `krow-mobile-design-system` — Colors, typography, icons, spacing, component patterns
|
- `krow-mobile-design-system` — Colors, typography, icons, spacing, component patterns
|
||||||
- `frontend-design`
|
- `frontend-design`
|
||||||
- `ui-ux-pro-max`
|
- `ui-ux-pro-max`
|
||||||
|
- `mobile-design`
|
||||||
|
|
||||||
Load additional skills as needed for specific design challenges.
|
Load additional skills as needed for specific design challenges.
|
||||||
|
|
||||||
|
|||||||
@@ -21,19 +21,42 @@ This skill defines the design token system, component patterns, screen structure
|
|||||||
|
|
||||||
### Color Palette
|
### Color Palette
|
||||||
|
|
||||||
|
**Primary:**
|
||||||
| Token | Hex | Usage |
|
| Token | Hex | Usage |
|
||||||
|-------|-----|-------|
|
|-------|-----|-------|
|
||||||
| Primary | `#0A39DF` | CTAs, active states, links, selected chips, nav active icons, pay rates |
|
|
||||||
| Foreground | `#121826` | Headings, primary text, dark UI elements |
|
|
||||||
| Text Secondary | `#6A7382` | Labels, captions, inactive nav, section headers, placeholder text, back chevrons |
|
|
||||||
| Secondary BG | `#F1F3F5` | Subtle backgrounds, dividers, map placeholders |
|
|
||||||
| Border | `#D1D5DB` | Card borders, unselected chip borders, outline button borders |
|
|
||||||
| Input Border | `#E2E8F0` | Text input borders (lighter than general border) |
|
|
||||||
| Destructive | `#F04444` | Error states, destructive actions (e.g., Request Swap) |
|
|
||||||
| Background | `#FAFBFC` | Page/artboard background |
|
| Background | `#FAFBFC` | Page/artboard background |
|
||||||
| Card BG | `#FFFFFF` | Card surfaces, input backgrounds |
|
| Foreground | `#121826` | Headings, primary text, dark UI elements |
|
||||||
| Success | `#059669` | Active status dot, checkmark icons, requirement met |
|
| Primary | `#0A39DF` | CTAs, active states, links, selected chips, nav active icons, pay rates |
|
||||||
| Warning Amber | `#D97706` | Urgent/Pending badge text |
|
| Primary Fg | `#F7FAFC` | Light foreground on primary surfaces |
|
||||||
|
|
||||||
|
**Semantic:**
|
||||||
|
| Token | Hex | Usage |
|
||||||
|
|-------|-----|-------|
|
||||||
|
| Secondary | `#F1F3F5` | Subtle backgrounds, dividers, secondary button bg |
|
||||||
|
| Accent | `#F9E547` | Highlight, warning chip accents |
|
||||||
|
| Text Secondary | `#6A7382` | Labels, captions, inactive nav, section headers, back chevrons |
|
||||||
|
| Destructive | `#F04444` | Error states, destructive actions |
|
||||||
|
|
||||||
|
**Border & Input:**
|
||||||
|
| Token | Hex | Usage |
|
||||||
|
|-------|-----|-------|
|
||||||
|
| Border | `#D1D5DB` | Card borders, unselected chip borders, outline button borders |
|
||||||
|
| Input | `#F5F6F8` | Text input background (read-only/disabled states) |
|
||||||
|
|
||||||
|
**Status:**
|
||||||
|
| Token | Hex | Usage |
|
||||||
|
|-------|-----|-------|
|
||||||
|
| Success | `#10B981` | Accept buttons, active status, checkmarks |
|
||||||
|
| Info | `#0A39DF` | Informational badges (same as Primary) |
|
||||||
|
| Warning | `#D97706` | Urgent/Pending badge text |
|
||||||
|
| Neutral | `#94A3B8` | Disabled text, placeholder text |
|
||||||
|
| Danger | `#F04444` | Error badges, destructive (same as Destructive) |
|
||||||
|
|
||||||
|
**Gradients:**
|
||||||
|
| Token | Definition | Usage |
|
||||||
|
|-------|-----------|-------|
|
||||||
|
| mobileHero | Foreground → Primary → Primary Fg | Hero sections, splash screens |
|
||||||
|
| adminHero | Primary → Success | Admin/dashboard hero cards |
|
||||||
|
|
||||||
### Semantic Badge Colors
|
### Semantic Badge Colors
|
||||||
|
|
||||||
@@ -44,74 +67,121 @@ This skill defines the design token system, component patterns, screen structure
|
|||||||
| Pending | `#FEF9EE` | `#D97706` |
|
| Pending | `#FEF9EE` | `#D97706` |
|
||||||
| Urgent | `#FEF9EE` | `#D97706` |
|
| Urgent | `#FEF9EE` | `#D97706` |
|
||||||
| One-Time | `#ECFDF5` | `#059669` |
|
| One-Time | `#ECFDF5` | `#059669` |
|
||||||
| Recurring | `#EBF0FF` | `#0A39DF` (use `#EFF6FF` bg on detail pages) |
|
| Recurring | `#EFF6FF` | `#0A39DF` |
|
||||||
|
|
||||||
### Typography
|
### Typography
|
||||||
|
|
||||||
| Style | Font | Size | Weight | Line Height | Usage |
|
**Inter Tight — Headings:**
|
||||||
|-------|------|------|--------|-------------|-------|
|
| Style | Size | Weight | Letter Spacing | Line Height | Usage |
|
||||||
| Display | Inter Tight | 28px | 700 | 34px | Page titles (Find Shifts, My Shifts) |
|
|-------|------|--------|---------------|-------------|-------|
|
||||||
| H1 | Inter Tight | 24px | 700 | 30px | Detail page titles (venue names) |
|
| Display | 28px | 700 | -0.02em | 34px | Page titles (Find Shifts, My Shifts) |
|
||||||
| H2 | Inter Tight | 20px | 700 | 26px | Section headings |
|
| Heading 1 | 24px | 700 | -0.02em | 30px | Detail page titles (venue names) |
|
||||||
| H3 | Inter Tight | 18px | 700 | 22px | Card titles, schedule values |
|
| Heading 2 | 20px | 700 | -0.01em | 26px | Section headings |
|
||||||
| Body Large | Manrope | 16px | 600 | 20px | Button text, CTA labels |
|
| Heading 3 | 18px | 700 | -0.01em | 22px | Card titles, schedule values |
|
||||||
| Body Default | Manrope | 14px | 400-500 | 18px | Body text, descriptions |
|
| Heading 4 | 16px | 700 | — | 20px | Card titles (standard cards), sub-headings |
|
||||||
| Body Small | Manrope | 13px | 400-500 | 16px | Card metadata, time/pay info |
|
|
||||||
| Caption | Manrope | 12px | 500-600 | 16px | Small chip text, tab labels |
|
|
||||||
| Section Label | Manrope | 11px | 700 | 14px | Uppercase section headers (letter-spacing: 0.06em) |
|
|
||||||
| Badge Text | Manrope | 11px | 600-700 | 14px | Status badge labels (letter-spacing: 0.04em) |
|
|
||||||
| Nav Label | Manrope | 10px | 600 | 12px | Bottom nav labels |
|
|
||||||
|
|
||||||
### Spacing
|
**Manrope — Body:**
|
||||||
|
| Style | Size | Weight | Line Height | Usage |
|
||||||
|
|-------|------|--------|-------------|-------|
|
||||||
|
| Body Large Regular | 16px | 400 | 20px | Long body text |
|
||||||
|
| Body Large Medium | 16px | 500 | 20px | Emphasized body text |
|
||||||
|
| Body Large Semibold | 16px | 600 | 20px | Strong labels, Full Width CTA text (15px) |
|
||||||
|
| Body Default | 14px | 400 | 18px | Body text, descriptions |
|
||||||
|
| Body Default Semibold | 14px | 600 | 18px | Button text, chip text, bold body |
|
||||||
|
| Caption | 12px | 400 | 16px | Small text, helper text, input labels |
|
||||||
|
| Overline Label | 11px | 600 | 14px | Uppercase section headers (letter-spacing: 0.06em) |
|
||||||
|
| Badge Text | 11px | 600-700 | 14px | Status badge labels (letter-spacing: 0.04em) |
|
||||||
|
| Nav Label | 10px | 600 | 12px | Bottom nav labels |
|
||||||
|
|
||||||
|
### Spacing Scale
|
||||||
|
|
||||||
| Token | Value | Usage |
|
| Token | Value | Usage |
|
||||||
|-------|-------|-------|
|
|-------|-------|-------|
|
||||||
| Page padding | 24px | Horizontal padding from screen edge |
|
| xs | 4px | Tight spacing (subtitle under title) |
|
||||||
| Section gap | 16-24px | Between major content sections |
|
| sm | 8px | Element gap within groups |
|
||||||
| Group gap | 8-12px | Within a section (e.g., label to input) |
|
| md | 12px | Group gap (label to input) |
|
||||||
| Element gap | 4px | Tight spacing (e.g., subtitle under title) |
|
| lg | 16px | Card padding, medium section gap |
|
||||||
| Bottom safe area | 40px | Padding below last element / CTA |
|
| xl | 24px | Page margins, section gap |
|
||||||
|
| 2xl | 32px | Large section separation |
|
||||||
|
|
||||||
|
**Page Layout:**
|
||||||
|
| Token | Value |
|
||||||
|
|-------|-------|
|
||||||
|
| Page margins | 24px |
|
||||||
|
| Section gap | 24px |
|
||||||
|
| Card padding | 16px |
|
||||||
|
| Element gap | 8-12px |
|
||||||
|
| Background | `#FAFBFC` |
|
||||||
|
| Bottom safe area | 40px |
|
||||||
|
|
||||||
### Border Radii
|
### Border Radii
|
||||||
|
|
||||||
| Token | Value | Usage |
|
| Token | Value | Usage |
|
||||||
|-------|-------|-------|
|
|-------|-------|-------|
|
||||||
| sm | 8px | Small chips, badges, status pills, map placeholder |
|
| sm | 8px | Small chips, badges, status pills |
|
||||||
| md | 12px | Cards, inputs, location cards, contact cards, search fields |
|
| md | 12px | Cards, inputs, list row containers, data rows |
|
||||||
| lg | 14px | Buttons, CTA containers, shift cards (Find Shifts) |
|
| lg | 18px | Hero cards, gradient cards |
|
||||||
| xl | 24px | Not commonly used |
|
| xl | 24px | Large containers |
|
||||||
| pill | 999px | Progress bar segments only |
|
| pill | 999px | Progress bar segments only |
|
||||||
|
|
||||||
|
### Icon Sizes
|
||||||
|
|
||||||
|
Standard sizes: 16, 20, 24, 32dp
|
||||||
|
|
||||||
## 2. Component Patterns
|
## 2. Component Patterns
|
||||||
|
|
||||||
### Buttons
|
### Buttons
|
||||||
|
|
||||||
**Primary CTA:**
|
All buttons: radius 14px, padding 12px/24px, text Manrope 14px/600
|
||||||
- Background: `#0A39DF`, radius: 14px, height: 52px
|
|
||||||
- Text: Manrope 16px/600, color: `#FFFFFF`
|
|
||||||
- Padding: 16px vertical, 16px horizontal
|
|
||||||
|
|
||||||
**Secondary/Outline Button:**
|
**Primary:**
|
||||||
- Background: `#FFFFFF`, border: 1.5px `#D1D5DB`, radius: 14px, height: 52px
|
- Background: `#0A39DF`, text: `#FFFFFF`
|
||||||
- Text: Manrope 16px/600, color: `#121826`
|
|
||||||
|
|
||||||
**Destructive Outline Button:**
|
**Secondary:**
|
||||||
- Background: `#FFFFFF`, border: 1.5px `#F04444`, radius: 14px
|
- Background: `#F1F3F5`, border: 1.5px `#D1D5DB`, text: `#121826`
|
||||||
- Text: Manrope 14px/600, color: `#F04444`
|
|
||||||
|
**Destructive:**
|
||||||
|
- Background: `#F04444`, text: `#FFFFFF`
|
||||||
|
|
||||||
|
**Disabled:**
|
||||||
|
- Background: `#F1F3F5`, no border, text: `#94A3B8`
|
||||||
|
|
||||||
|
**Accept:**
|
||||||
|
- Background: `#10B981`, text: `#FFFFFF`
|
||||||
|
|
||||||
|
**Dark:**
|
||||||
|
- Background: `#121826`, text: `#FFFFFF`
|
||||||
|
|
||||||
|
**Full Width CTA:**
|
||||||
|
- Same as Primary but `width: 100%`, padding 14px/24px, text Manrope 15px/600
|
||||||
|
|
||||||
**Back Icon Button (Bottom CTA):**
|
**Back Icon Button (Bottom CTA):**
|
||||||
- 52x52px square, border: 1.5px `#D1D5DB`, radius: 14px, background: `#FFFFFF`
|
- 52x52px square, border: 0.5px `#D1D5DB`, radius: 14px, background: `#FFFFFF`
|
||||||
- Contains chevron-left SVG (20x20, viewBox 0 0 24 24, stroke `#121826`, strokeWidth 2)
|
- Contains chevron-left SVG (20x20, viewBox 0 0 24 24, stroke `#121826`, strokeWidth 2)
|
||||||
- Path: `M15 18L9 12L15 6`
|
- Path: `M15 18L9 12L15 6`
|
||||||
|
|
||||||
### Chips
|
### Chips
|
||||||
|
|
||||||
|
All chips: border 1.5px, text Manrope 14px/600, gap 8px for icon+text
|
||||||
|
|
||||||
**Default (Large) - for role/skill selection:**
|
**Default (Large) - for role/skill selection:**
|
||||||
- Selected: bg `#EFF6FF`, border 1.5px `#0A39DF`, radius 10px, padding 12px/16px
|
- Selected: bg `#EFF6FF`, border `#0A39DF`, radius 10px, padding 12px/16px
|
||||||
- Checkmark icon (14x14, stroke `#0A39DF`), text Manrope 14px/600 `#0A39DF`
|
- Checkmark icon (14x14, stroke `#0A39DF`), text `#0A39DF`
|
||||||
- Unselected: bg `#FFFFFF`, border 1.5px `#6A7382`, radius 10px, padding 12px/16px
|
- Unselected: bg `#FFFFFF`, border `#6A7382`, radius 10px, padding 12px/16px
|
||||||
- Text Manrope 14px/500 `#6A7382`
|
- Text Manrope 14px/500 `#6A7382`
|
||||||
|
|
||||||
|
**Warning Chips:**
|
||||||
|
- Selected: bg `#F9E5471A`, border `#E6A817`, radius 10px, padding 12px/16px
|
||||||
|
- Checkmark icon (stroke `#E6A817`), text `#E6A817`
|
||||||
|
- Unselected: bg `#FFFFFF`, border `#F0D78C`, radius 10px, padding 12px/16px
|
||||||
|
- Text `#E6A817`
|
||||||
|
|
||||||
|
**Error Chips:**
|
||||||
|
- Selected: bg `#FEF2F2`, border `#F04444`, radius 10px, padding 12px/16px
|
||||||
|
- Checkmark icon (stroke `#F04444`), text `#F04444`
|
||||||
|
- Unselected: bg `#FFFFFF`, border `#FECACA`, radius 10px, padding 12px/16px
|
||||||
|
- Text `#F04444`
|
||||||
|
|
||||||
**Small - for tabs, filters:**
|
**Small - for tabs, filters:**
|
||||||
- Selected: bg `#EFF6FF`, border 1.5px `#0A39DF`, radius 8px, padding 6px/12px
|
- Selected: bg `#EFF6FF`, border 1.5px `#0A39DF`, radius 8px, padding 6px/12px
|
||||||
- Checkmark icon (12x12), text Manrope 12px/600 `#0A39DF`
|
- Checkmark icon (12x12), text Manrope 12px/600 `#0A39DF`
|
||||||
@@ -119,8 +189,6 @@ This skill defines the design token system, component patterns, screen structure
|
|||||||
- Text Manrope 12px/500 `#6A7382`
|
- Text Manrope 12px/500 `#6A7382`
|
||||||
- Active (filled): bg `#0A39DF`, radius 8px, padding 6px/12px
|
- Active (filled): bg `#0A39DF`, radius 8px, padding 6px/12px
|
||||||
- Text Manrope 12px/600 `#FFFFFF`
|
- Text Manrope 12px/600 `#FFFFFF`
|
||||||
- Dark (filters button): bg `#121826`, radius 8px, padding 6px/12px
|
|
||||||
- Text Manrope 12px/600 `#FFFFFF`, with leading icon
|
|
||||||
|
|
||||||
**Status Badges:**
|
**Status Badges:**
|
||||||
- Radius: 8px, padding: 4px/8px
|
- Radius: 8px, padding: 4px/8px
|
||||||
@@ -131,39 +199,65 @@ This skill defines the design token system, component patterns, screen structure
|
|||||||
|
|
||||||
- Border: 1.5px `#E2E8F0`, radius: 12px, padding: 12px/14px
|
- Border: 1.5px `#E2E8F0`, radius: 12px, padding: 12px/14px
|
||||||
- Background: `#FFFFFF`
|
- Background: `#FFFFFF`
|
||||||
- Placeholder: Manrope 14px/400, color `#6A7382`
|
- Placeholder: Manrope 14px/400, color `#94A3B8`
|
||||||
- Filled: Manrope 14px/500, color `#121826`
|
- Filled: Manrope 14px/400, color `#111827`
|
||||||
- Label above: Manrope 14px/500, color `#121826`
|
- Label above: Manrope 12px/400, spacing 0%:
|
||||||
|
- Default/filled: color `#94A3B8`
|
||||||
|
- Filled with value: color `#6A7382`
|
||||||
|
- Focused: color `#0A39DF`
|
||||||
|
- Error: color `#F04444`
|
||||||
|
- Disabled: color `#94A3B8`
|
||||||
- Focused: border color `#0A39DF`, border-width 2px
|
- Focused: border color `#0A39DF`, border-width 2px
|
||||||
- Error: border color `#F04444`, helper text `#F04444`
|
- Error: border color `#F04444`, border-width 2px, background `#FEF2F2`
|
||||||
|
- Error helper text: Manrope 12px/400, color `#F04444`
|
||||||
|
|
||||||
### Cards (Shift List Items)
|
### Border Width
|
||||||
|
|
||||||
- Background: `#FFFFFF`, border: 1px `#D1D5DB`, radius: 12-14px
|
- **Standard border width: `0.5px`** — All card borders, dividers, and outline buttons use `0.5px` unless explicitly stated otherwise.
|
||||||
- Padding: 16px
|
- **Text inputs: `1.5px`** — To ensure visibility and distinction from card borders.
|
||||||
- Content: venue name (Manrope 15px/600 `#121826`), subtitle (Manrope 13px/400 `#6A7382`)
|
- **Chips: `1.5px`** — All chip variants (default, warning, error, small).
|
||||||
- Metadata row: icon (14px, `#6A7382`) + text (Manrope 13px/500 `#6A7382`)
|
- **Secondary buttons: `1.5px`** — Outline/secondary button borders.
|
||||||
- Pay rate: Inter Tight 18px/700 `#0A39DF`
|
|
||||||
|
|
||||||
### Schedule/Pay Info Cards
|
### Cards
|
||||||
|
|
||||||
- Two-column layout with 12px gap
|
**Standard Card:**
|
||||||
- Background: `#FFFFFF`, border: 1px `#D1D5DB`, radius: 12px, padding: 16px
|
- Background: `#FFFFFF`, border: 0.5px `#D1D5DB`, radius: 12px, padding: 16px
|
||||||
- Label: Manrope 11px/500-700 uppercase `#6A7382` (letter-spacing 0.05em)
|
- Title: Inter Tight 16px/700 `#121826`
|
||||||
- Value: Inter Tight 18px/700 `#121826` (schedule) or `#121826` (pay)
|
- Body: Manrope 14px/400 `#6A7382`
|
||||||
- Sub-text: Manrope 13px/400 `#6A7382`
|
- Gap: 8px between title and body
|
||||||
|
|
||||||
|
**Hero / Gradient Card:**
|
||||||
|
- Radius: 18px, padding: 20px, gap: 6px
|
||||||
|
- Background: gradient (mobileHero or adminHero)
|
||||||
|
- Label: Manrope 12px/400 `#FFFFFFB3` (white 70%)
|
||||||
|
- Value: Inter Tight 28px/700 `#FFFFFF`
|
||||||
|
- Sub-text: Manrope 12px/400 `#FFFFFF99` (white 60%)
|
||||||
|
|
||||||
|
**List Rows (grouped):**
|
||||||
|
- Container: radius 12px, border 0.5px `#D1D5DB`, background `#FFFFFF`, overflow clip
|
||||||
|
- Row: padding ~16px, gap between text elements 2px
|
||||||
|
- Row title: Manrope 14px/600 `#121826`
|
||||||
|
- Row subtitle: Manrope 13px/400 `#6A7382`
|
||||||
|
- Row divider: 1px `#D1D5DB` (between rows, not on last)
|
||||||
|
- Chevron: `›` or SVG, `#6A7382`
|
||||||
|
|
||||||
|
**Data Row:**
|
||||||
|
- Background: `#F1F3F5`, radius: 12px, padding: 12px
|
||||||
|
- Label: Manrope 11px/400 `#6A7382`
|
||||||
|
- Value: Inter Tight 20px/700 `#121826`
|
||||||
|
- Layout: flex row, equal width columns, gap 8px
|
||||||
|
|
||||||
### Contact/Info Rows
|
### Contact/Info Rows
|
||||||
|
|
||||||
- Container: radius 12px, border 1px `#D1D5DB`, background `#FFFFFF`, overflow clip
|
- Container: radius 12px, border 0.5px `#D1D5DB`, background `#FFFFFF`, overflow clip
|
||||||
- Row: padding 13px/16px, gap 10px, border-bottom 1px `#F1F3F5` (except last)
|
- Row: padding 13px/16px, gap 10px, border-bottom 0.5px `#F1F3F5` (except last)
|
||||||
- Icon: 16px, stroke `#6A7382`
|
- Icon: 16px, stroke `#6A7382`
|
||||||
- Label: Manrope 13px/500 `#6A7382`, width 72px fixed
|
- Label: Manrope 13px/500 `#6A7382`, width 72px fixed
|
||||||
- Value: Manrope 13px/500 `#121826` (or `#0A39DF` for phone/links)
|
- Value: Manrope 13px/500 `#121826` (or `#0A39DF` for phone/links)
|
||||||
|
|
||||||
### Section Headers
|
### Section Headers
|
||||||
|
|
||||||
- Text: Manrope 11px/700, uppercase, letter-spacing 0.06em, color `#6A7382`
|
- Text: Manrope 11px/600, uppercase, letter-spacing 0.06em, color `#6A7382`
|
||||||
- Gap to content below: 10px
|
- Gap to content below: 10px
|
||||||
|
|
||||||
## 3. Screen Structure
|
## 3. Screen Structure
|
||||||
|
|||||||
21
.github/PULL_REQUEST_TEMPLATE.md
vendored
@@ -2,16 +2,10 @@
|
|||||||
|
|
||||||
<!-- Provide a clear and concise description of your changes -->
|
<!-- Provide a clear and concise description of your changes -->
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🔗 Related Issues
|
## 🔗 Related Issues
|
||||||
|
|
||||||
<!-- Link any related issues using #issue_number -->
|
<!-- Link any related issues using #issue_number -->
|
||||||
|
|
||||||
Closes #
|
|
||||||
Related to #
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🎯 Type of Change
|
## 🎯 Type of Change
|
||||||
|
|
||||||
@@ -26,8 +20,6 @@ Related to #
|
|||||||
- [ ] 🎨 **Style** (formatting, linting, or minor code style changes)
|
- [ ] 🎨 **Style** (formatting, linting, or minor code style changes)
|
||||||
- [ ] 🏗️ **Architecture** (significant structural changes)
|
- [ ] 🏗️ **Architecture** (significant structural changes)
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📦 Affected Areas
|
## 📦 Affected Areas
|
||||||
|
|
||||||
<!-- Mark the relevant areas that were modified -->
|
<!-- Mark the relevant areas that were modified -->
|
||||||
@@ -39,8 +31,6 @@ Related to #
|
|||||||
- [ ] 🚀 **CI/CD** (GitHub Actions, deployment configs)
|
- [ ] 🚀 **CI/CD** (GitHub Actions, deployment configs)
|
||||||
- [ ] 📚 **Documentation** (Docs, onboarding guides)
|
- [ ] 📚 **Documentation** (Docs, onboarding guides)
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## ✅ Testing
|
## ✅ Testing
|
||||||
|
|
||||||
<!-- Describe how you tested these changes -->
|
<!-- Describe how you tested these changes -->
|
||||||
@@ -48,9 +38,6 @@ Related to #
|
|||||||
**Test Details:**
|
**Test Details:**
|
||||||
<!-- Provide specific test cases or scenarios -->
|
<!-- Provide specific test cases or scenarios -->
|
||||||
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🔄 Breaking Changes
|
## 🔄 Breaking Changes
|
||||||
|
|
||||||
<!-- Are there any breaking changes? If yes, describe them -->
|
<!-- Are there any breaking changes? If yes, describe them -->
|
||||||
@@ -61,9 +48,6 @@ Related to #
|
|||||||
**Details:**
|
**Details:**
|
||||||
<!-- Describe migration path or deprecation period if applicable -->
|
<!-- Describe migration path or deprecation period if applicable -->
|
||||||
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🎯 Checklist
|
## 🎯 Checklist
|
||||||
|
|
||||||
<!-- Complete this before requesting review -->
|
<!-- Complete this before requesting review -->
|
||||||
@@ -79,15 +63,10 @@ Related to #
|
|||||||
- [ ] Sensitive data is not committed
|
- [ ] Sensitive data is not committed
|
||||||
- [ ] Environment variables documented (if added)
|
- [ ] Environment variables documented (if added)
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📝 Additional Notes
|
## 📝 Additional Notes
|
||||||
|
|
||||||
<!-- Any additional context, decisions, or considerations -->
|
<!-- Any additional context, decisions, or considerations -->
|
||||||
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🔍 Review Checklist for Maintainers
|
## 🔍 Review Checklist for Maintainers
|
||||||
|
|
||||||
- [ ] Code quality and readability
|
- [ ] Code quality and readability
|
||||||
|
|||||||
2
.gitignore
vendored
@@ -196,4 +196,6 @@ apps/mobile/legacy/*
|
|||||||
AGENTS.md
|
AGENTS.md
|
||||||
TASKS.md
|
TASKS.md
|
||||||
CLAUDE.md
|
CLAUDE.md
|
||||||
|
.claude/agents/paper-designer.md
|
||||||
|
.claude/agent-memory/paper-designer
|
||||||
\n# Android Signing (Secure)\n**.jks\n**key.properties
|
\n# Android Signing (Secure)\n**.jks\n**key.properties
|
||||||
|
|||||||
149
CLAUDE.md
@@ -1,149 +0,0 @@
|
|||||||
# CLAUDE.md
|
|
||||||
|
|
||||||
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
|
||||||
|
|
||||||
## Project Overview
|
|
||||||
|
|
||||||
KROW Workforce is a workforce management platform monorepo containing Flutter mobile apps, a React web dashboard, and Firebase backend services.
|
|
||||||
|
|
||||||
## Repository Structure
|
|
||||||
|
|
||||||
```
|
|
||||||
apps/mobile/ # Flutter monorepo (Melos workspace)
|
|
||||||
apps/staff/ # Staff mobile app
|
|
||||||
apps/client/ # Client (business) mobile app
|
|
||||||
packages/
|
|
||||||
design_system/ # Shared UI tokens & components
|
|
||||||
core/ # Cross-cutting concerns (mixins, extensions)
|
|
||||||
core_localization/# i18n via Slang
|
|
||||||
domain/ # Pure Dart entities & failures
|
|
||||||
data_connect/ # Firebase Data Connect adapter (connectors)
|
|
||||||
features/staff/ # Staff feature packages
|
|
||||||
features/client/ # Client feature packages
|
|
||||||
apps/web/ # React/Vite web dashboard (TypeScript, Tailwind, Redux Toolkit)
|
|
||||||
backend/
|
|
||||||
dataconnect/ # Firebase Data Connect GraphQL schemas
|
|
||||||
core-api/ # Core business logic service
|
|
||||||
cloud-functions/ # Serverless functions
|
|
||||||
```
|
|
||||||
|
|
||||||
## Common Commands
|
|
||||||
|
|
||||||
All commands use the root `Makefile` (composed from `makefiles/*.mk`). Run `make help` for the full list.
|
|
||||||
|
|
||||||
### Mobile (Flutter)
|
|
||||||
```bash
|
|
||||||
make mobile-install # Bootstrap Melos workspace + generate SDK
|
|
||||||
make mobile-staff-dev-android # Run staff app (add DEVICE=android)
|
|
||||||
make mobile-client-dev-android # Run client app
|
|
||||||
make mobile-analyze # Lint (flutter analyze)
|
|
||||||
make mobile-test # Run tests
|
|
||||||
make test-e2e # Maestro E2E tests (both apps)
|
|
||||||
```
|
|
||||||
|
|
||||||
Single-package operations via Melos:
|
|
||||||
```bash
|
|
||||||
cd apps/mobile
|
|
||||||
melos run gen:l10n # Generate localization (Slang)
|
|
||||||
melos run gen:build # Run build_runner
|
|
||||||
melos run analyze:all # Analyze all packages
|
|
||||||
melos run test:all # Test all packages
|
|
||||||
```
|
|
||||||
|
|
||||||
### Web (React/Vite)
|
|
||||||
```bash
|
|
||||||
make web-install # npm install
|
|
||||||
make web-dev # Start dev server
|
|
||||||
make web-build # Production build
|
|
||||||
make web-lint # ESLint
|
|
||||||
make web-test # Vitest
|
|
||||||
```
|
|
||||||
|
|
||||||
### Backend (Data Connect)
|
|
||||||
```bash
|
|
||||||
make dataconnect-generate-sdk [ENV=dev] # Generate SDK
|
|
||||||
make dataconnect-deploy [ENV=dev] # Deploy schemas
|
|
||||||
make dataconnect-sync-full [ENV=dev] # Deploy + migrate + generate
|
|
||||||
```
|
|
||||||
|
|
||||||
## Mobile Architecture
|
|
||||||
|
|
||||||
**Clean Architecture** with strict inward dependency flow:
|
|
||||||
|
|
||||||
```
|
|
||||||
Presentation (Pages, BLoCs, Widgets)
|
|
||||||
→ Application (Use Cases)
|
|
||||||
→ Domain (Entities, Repository Interfaces, Failures)
|
|
||||||
← Data (Repository Implementations, Connectors)
|
|
||||||
```
|
|
||||||
|
|
||||||
### Key Patterns
|
|
||||||
|
|
||||||
- **State management:** Flutter BLoC/Cubit. Register BLoCs with `i.add()` (transient), never `i.addSingleton()`. Use `BlocProvider.value()` for shared BLoCs.
|
|
||||||
- **DI & Routing:** Flutter Modular. Safe navigation via `safeNavigate()`, `safePush()`, `popSafe()`. Never use `Navigator.push()` directly.
|
|
||||||
- **Error handling in BLoCs:** Use `BlocErrorHandler` mixin with `_safeEmit()` to prevent StateError on disposed BLoCs.
|
|
||||||
- **Backend access:** All Data Connect calls go through the `data_connect` package's Connectors. Use `_service.run(() => connector.<query>().execute())` for automatic auth/token management.
|
|
||||||
- **Session management:** `SessionHandlerMixin` + `SessionListener` widget. Initialized in `main.dart` with role-based config.
|
|
||||||
- **Localization:** All user-facing strings via `context.strings.<key>` from `core_localization`. Error messages via `ErrorTranslator`.
|
|
||||||
- **Design system:** Use tokens from `UiColors`, `UiTypography`, `UiConstants`. Never hardcode colors, fonts, or spacing.
|
|
||||||
|
|
||||||
### Feature Package Structure
|
|
||||||
|
|
||||||
New features go in `apps/mobile/packages/features/<app>/<feature>/`:
|
|
||||||
```
|
|
||||||
lib/src/
|
|
||||||
domain/repositories/ # Abstract interface classes
|
|
||||||
data/repositories_impl/ # Implementations using data_connect
|
|
||||||
application/ # Use cases (business logic)
|
|
||||||
presentation/
|
|
||||||
blocs/ # BLoCs/Cubits
|
|
||||||
pages/ # Pages (prefer StatelessWidget)
|
|
||||||
widgets/ # Reusable widgets
|
|
||||||
```
|
|
||||||
|
|
||||||
### Critical Rules
|
|
||||||
|
|
||||||
- Features must not import other features directly
|
|
||||||
- Business logic belongs in Use Cases, never in BLoCs or widgets
|
|
||||||
- Firebase packages (`firebase_auth`, `firebase_data_connect`) belong only in `data_connect`
|
|
||||||
- Don't add 3rd-party packages without checking `packages/core` first
|
|
||||||
- Generated code directories are excluded from analysis: `**/dataconnect_generated/**`, `**/*.g.dart`, `**/*.freezed.dart`
|
|
||||||
|
|
||||||
## Code Generation
|
|
||||||
|
|
||||||
- **Slang** (i18n): Input `lib/src/l10n/*.i18n.json` → Output `strings.g.dart`
|
|
||||||
- **build_runner**: Various generated files (`.g.dart`, `.freezed.dart`)
|
|
||||||
- **Firebase Data Connect**: Auto-generated SDK in `packages/data_connect/lib/src/dataconnect_generated/`
|
|
||||||
|
|
||||||
## Naming Conventions (Dart)
|
|
||||||
|
|
||||||
| Type | Convention | Example |
|
|
||||||
|------|-----------|---------|
|
|
||||||
| Files | `snake_case` | `user_profile_page.dart` |
|
|
||||||
| Classes | `PascalCase` | `UserProfilePage` |
|
|
||||||
| Interfaces | suffix `Interface` | `AuthRepositoryInterface` |
|
|
||||||
| Implementations | suffix `Impl` | `AuthRepositoryImpl` |
|
|
||||||
|
|
||||||
## Key Documentation
|
|
||||||
|
|
||||||
- `docs/MOBILE/00-agent-development-rules.md` — Non-negotiable architecture rules
|
|
||||||
- `docs/MOBILE/01-architecture-principles.md` — Clean architecture details
|
|
||||||
- `docs/MOBILE/02-design-system-usage.md` — Design system token usage
|
|
||||||
- `docs/MOBILE/03-data-connect-connectors-pattern.md` — Backend integration pattern
|
|
||||||
- `docs/MOBILE/05-release-process.md` — Release quick reference
|
|
||||||
- `docs/RELEASE/mobile-releases.md` — Complete release guide
|
|
||||||
|
|
||||||
## Skills & Sub-Agents
|
|
||||||
|
|
||||||
#### Skills
|
|
||||||
- The project has 4 specialized skills in `.claude/skills/` that provide deep domain knowledge. Invoke them and other global skills that you have when working in their domains.
|
|
||||||
|
|
||||||
#### Sub-Agents
|
|
||||||
- The project has 4 sub-agents in `.claude/sub-agents/` that can be invoked for specific tasks. Invoke them and other global sub-agents that you have when working in their domains.
|
|
||||||
|
|
||||||
|
|
||||||
## CI/CD
|
|
||||||
|
|
||||||
- `.github/workflows/mobile-ci.yml` — Mobile build & test on PR
|
|
||||||
- `.github/workflows/product-release.yml` — Automated versioning, tags, APK builds
|
|
||||||
- `.github/workflows/web-quality.yml` — Web linting & tests
|
|
||||||
|
After Width: | Height: | Size: 3.7 KiB |
|
After Width: | Height: | Size: 2.5 KiB |
|
After Width: | Height: | Size: 4.9 KiB |
|
After Width: | Height: | Size: 7.6 KiB |
|
After Width: | Height: | Size: 10 KiB |
@@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<background android:drawable="@android:color/white"/>
|
||||||
|
<foreground android:drawable="@mipmap/launcher_icon"/>
|
||||||
|
</adaptive-icon>
|
||||||
|
After Width: | Height: | Size: 4.0 KiB |
|
After Width: | Height: | Size: 2.6 KiB |
|
After Width: | Height: | Size: 5.5 KiB |
|
After Width: | Height: | Size: 8.5 KiB |
|
After Width: | Height: | Size: 12 KiB |
@@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<background android:drawable="@android:color/white"/>
|
||||||
|
<foreground android:drawable="@mipmap/launcher_icon"/>
|
||||||
|
</adaptive-icon>
|
||||||
BIN
apps/mobile/apps/client/assets/logo-dev.png
Normal file
|
After Width: | Height: | Size: 85 KiB |
BIN
apps/mobile/apps/client/assets/logo-stage.png
Normal file
|
After Width: | Height: | Size: 88 KiB |
2
apps/mobile/apps/client/ios/Flutter/Dev.xcconfig
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
// Build configuration for dev flavor - use AppIcon-dev
|
||||||
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon-dev
|
||||||
2
apps/mobile/apps/client/ios/Flutter/Stage.xcconfig
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
// Build configuration for stage flavor - use AppIcon-stage
|
||||||
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon-stage
|
||||||
@@ -256,7 +256,7 @@
|
|||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
shellPath = /bin/sh;
|
shellPath = /bin/sh;
|
||||||
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
|
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build\n";
|
||||||
};
|
};
|
||||||
BC26E38F2F5F614000517BDF /* ShellScript */ = {
|
BC26E38F2F5F614000517BDF /* ShellScript */ = {
|
||||||
isa = PBXShellScriptBuildPhase;
|
isa = PBXShellScriptBuildPhase;
|
||||||
@@ -383,7 +383,7 @@
|
|||||||
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
|
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
APP_NAME = "KROW With Us Business [STAGE]";
|
APP_NAME = "KROW With Us Business [STAGE]";
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-stage";
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
@@ -563,7 +563,7 @@
|
|||||||
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
|
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
APP_NAME = "KROW With Us Business [DEV] ";
|
APP_NAME = "KROW With Us Business [DEV] ";
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-dev";
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
@@ -665,7 +665,7 @@
|
|||||||
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
|
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
APP_NAME = "KROW With Us Business [DEV] ";
|
APP_NAME = "KROW With Us Business [DEV] ";
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-dev";
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
@@ -762,7 +762,7 @@
|
|||||||
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
|
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
APP_NAME = "KROW With Us Business [STAGE] ";
|
APP_NAME = "KROW With Us Business [STAGE] ";
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-stage";
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
@@ -951,7 +951,7 @@
|
|||||||
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
|
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
APP_NAME = "KROW With Us Business [DEV] ";
|
APP_NAME = "KROW With Us Business [DEV] ";
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-dev";
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
@@ -1040,7 +1040,7 @@
|
|||||||
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
|
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
APP_NAME = "KROW With Us Business [STAGE]";
|
APP_NAME = "KROW With Us Business [STAGE]";
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-stage";
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
@@ -1220,7 +1220,7 @@
|
|||||||
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
|
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
APP_NAME = "KROW With Us Business [DEV] ";
|
APP_NAME = "KROW With Us Business [DEV] ";
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-dev";
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
@@ -1311,7 +1311,7 @@
|
|||||||
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
|
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
APP_NAME = "KROW With Us Business [STAGE] ";
|
APP_NAME = "KROW With Us Business [STAGE] ";
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-stage";
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
{"images":[{"size":"20x20","idiom":"iphone","filename":"Icon-App-20x20@2x.png","scale":"2x"},{"size":"20x20","idiom":"iphone","filename":"Icon-App-20x20@3x.png","scale":"3x"},{"size":"29x29","idiom":"iphone","filename":"Icon-App-29x29@1x.png","scale":"1x"},{"size":"29x29","idiom":"iphone","filename":"Icon-App-29x29@2x.png","scale":"2x"},{"size":"29x29","idiom":"iphone","filename":"Icon-App-29x29@3x.png","scale":"3x"},{"size":"40x40","idiom":"iphone","filename":"Icon-App-40x40@2x.png","scale":"2x"},{"size":"40x40","idiom":"iphone","filename":"Icon-App-40x40@3x.png","scale":"3x"},{"size":"57x57","idiom":"iphone","filename":"Icon-App-57x57@1x.png","scale":"1x"},{"size":"57x57","idiom":"iphone","filename":"Icon-App-57x57@2x.png","scale":"2x"},{"size":"60x60","idiom":"iphone","filename":"Icon-App-60x60@2x.png","scale":"2x"},{"size":"60x60","idiom":"iphone","filename":"Icon-App-60x60@3x.png","scale":"3x"},{"size":"20x20","idiom":"ipad","filename":"Icon-App-20x20@1x.png","scale":"1x"},{"size":"20x20","idiom":"ipad","filename":"Icon-App-20x20@2x.png","scale":"2x"},{"size":"29x29","idiom":"ipad","filename":"Icon-App-29x29@1x.png","scale":"1x"},{"size":"29x29","idiom":"ipad","filename":"Icon-App-29x29@2x.png","scale":"2x"},{"size":"40x40","idiom":"ipad","filename":"Icon-App-40x40@1x.png","scale":"1x"},{"size":"40x40","idiom":"ipad","filename":"Icon-App-40x40@2x.png","scale":"2x"},{"size":"50x50","idiom":"ipad","filename":"Icon-App-50x50@1x.png","scale":"1x"},{"size":"50x50","idiom":"ipad","filename":"Icon-App-50x50@2x.png","scale":"2x"},{"size":"72x72","idiom":"ipad","filename":"Icon-App-72x72@1x.png","scale":"1x"},{"size":"72x72","idiom":"ipad","filename":"Icon-App-72x72@2x.png","scale":"2x"},{"size":"76x76","idiom":"ipad","filename":"Icon-App-76x76@1x.png","scale":"1x"},{"size":"76x76","idiom":"ipad","filename":"Icon-App-76x76@2x.png","scale":"2x"},{"size":"83.5x83.5","idiom":"ipad","filename":"Icon-App-83.5x83.5@2x.png","scale":"2x"},{"size":"1024x1024","idiom":"ios-marketing","filename":"Icon-App-1024x1024@1x.png","scale":"1x"}],"info":{"version":1,"author":"xcode"}}
|
||||||
|
After Width: | Height: | Size: 95 KiB |
|
After Width: | Height: | Size: 1.0 KiB |
|
After Width: | Height: | Size: 2.0 KiB |
|
After Width: | Height: | Size: 3.0 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 3.0 KiB |
|
After Width: | Height: | Size: 4.4 KiB |
|
After Width: | Height: | Size: 2.0 KiB |
|
After Width: | Height: | Size: 4.1 KiB |
|
After Width: | Height: | Size: 6.2 KiB |
|
After Width: | Height: | Size: 2.5 KiB |
|
After Width: | Height: | Size: 5.1 KiB |
|
After Width: | Height: | Size: 2.9 KiB |
|
After Width: | Height: | Size: 5.9 KiB |
|
After Width: | Height: | Size: 6.2 KiB |
|
After Width: | Height: | Size: 9.6 KiB |
|
After Width: | Height: | Size: 3.7 KiB |
|
After Width: | Height: | Size: 7.6 KiB |
|
After Width: | Height: | Size: 3.9 KiB |
|
After Width: | Height: | Size: 8.0 KiB |
|
After Width: | Height: | Size: 8.9 KiB |
@@ -0,0 +1 @@
|
|||||||
|
{"images":[{"size":"20x20","idiom":"iphone","filename":"Icon-App-20x20@2x.png","scale":"2x"},{"size":"20x20","idiom":"iphone","filename":"Icon-App-20x20@3x.png","scale":"3x"},{"size":"29x29","idiom":"iphone","filename":"Icon-App-29x29@1x.png","scale":"1x"},{"size":"29x29","idiom":"iphone","filename":"Icon-App-29x29@2x.png","scale":"2x"},{"size":"29x29","idiom":"iphone","filename":"Icon-App-29x29@3x.png","scale":"3x"},{"size":"40x40","idiom":"iphone","filename":"Icon-App-40x40@2x.png","scale":"2x"},{"size":"40x40","idiom":"iphone","filename":"Icon-App-40x40@3x.png","scale":"3x"},{"size":"57x57","idiom":"iphone","filename":"Icon-App-57x57@1x.png","scale":"1x"},{"size":"57x57","idiom":"iphone","filename":"Icon-App-57x57@2x.png","scale":"2x"},{"size":"60x60","idiom":"iphone","filename":"Icon-App-60x60@2x.png","scale":"2x"},{"size":"60x60","idiom":"iphone","filename":"Icon-App-60x60@3x.png","scale":"3x"},{"size":"20x20","idiom":"ipad","filename":"Icon-App-20x20@1x.png","scale":"1x"},{"size":"20x20","idiom":"ipad","filename":"Icon-App-20x20@2x.png","scale":"2x"},{"size":"29x29","idiom":"ipad","filename":"Icon-App-29x29@1x.png","scale":"1x"},{"size":"29x29","idiom":"ipad","filename":"Icon-App-29x29@2x.png","scale":"2x"},{"size":"40x40","idiom":"ipad","filename":"Icon-App-40x40@1x.png","scale":"1x"},{"size":"40x40","idiom":"ipad","filename":"Icon-App-40x40@2x.png","scale":"2x"},{"size":"50x50","idiom":"ipad","filename":"Icon-App-50x50@1x.png","scale":"1x"},{"size":"50x50","idiom":"ipad","filename":"Icon-App-50x50@2x.png","scale":"2x"},{"size":"72x72","idiom":"ipad","filename":"Icon-App-72x72@1x.png","scale":"1x"},{"size":"72x72","idiom":"ipad","filename":"Icon-App-72x72@2x.png","scale":"2x"},{"size":"76x76","idiom":"ipad","filename":"Icon-App-76x76@1x.png","scale":"1x"},{"size":"76x76","idiom":"ipad","filename":"Icon-App-76x76@2x.png","scale":"2x"},{"size":"83.5x83.5","idiom":"ipad","filename":"Icon-App-83.5x83.5@2x.png","scale":"2x"},{"size":"1024x1024","idiom":"ios-marketing","filename":"Icon-App-1024x1024@1x.png","scale":"1x"}],"info":{"version":1,"author":"xcode"}}
|
||||||
|
After Width: | Height: | Size: 108 KiB |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 2.2 KiB |
|
After Width: | Height: | Size: 3.3 KiB |
|
After Width: | Height: | Size: 1.5 KiB |
|
After Width: | Height: | Size: 3.1 KiB |
|
After Width: | Height: | Size: 4.9 KiB |
|
After Width: | Height: | Size: 2.2 KiB |
|
After Width: | Height: | Size: 4.5 KiB |
|
After Width: | Height: | Size: 7.0 KiB |
|
After Width: | Height: | Size: 2.7 KiB |
|
After Width: | Height: | Size: 5.7 KiB |
|
After Width: | Height: | Size: 3.1 KiB |
|
After Width: | Height: | Size: 6.5 KiB |
|
After Width: | Height: | Size: 7.0 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 4.0 KiB |
|
After Width: | Height: | Size: 8.5 KiB |
|
After Width: | Height: | Size: 4.2 KiB |
|
After Width: | Height: | Size: 8.9 KiB |
|
After Width: | Height: | Size: 9.9 KiB |
|
After Width: | Height: | Size: 4.0 KiB |
|
After Width: | Height: | Size: 2.6 KiB |
|
After Width: | Height: | Size: 5.4 KiB |
|
After Width: | Height: | Size: 8.1 KiB |
|
After Width: | Height: | Size: 11 KiB |
@@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<background android:drawable="@android:color/white"/>
|
||||||
|
<foreground android:drawable="@mipmap/launcher_icon"/>
|
||||||
|
</adaptive-icon>
|
||||||
|
After Width: | Height: | Size: 4.2 KiB |
|
After Width: | Height: | Size: 2.7 KiB |
|
After Width: | Height: | Size: 5.6 KiB |
|
After Width: | Height: | Size: 8.7 KiB |
|
After Width: | Height: | Size: 12 KiB |
@@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<background android:drawable="@android:color/white"/>
|
||||||
|
<foreground android:drawable="@mipmap/launcher_icon"/>
|
||||||
|
</adaptive-icon>
|
||||||
BIN
apps/mobile/apps/staff/assets/logo-dev.png
Normal file
|
After Width: | Height: | Size: 90 KiB |
BIN
apps/mobile/apps/staff/assets/logo-stage.png
Normal file
|
After Width: | Height: | Size: 94 KiB |
2
apps/mobile/apps/staff/ios/Flutter/Dev.xcconfig
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
// Build configuration for dev flavor - use AppIcon-dev
|
||||||
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon-dev
|
||||||
2
apps/mobile/apps/staff/ios/Flutter/Stage.xcconfig
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
// Build configuration for stage flavor - use AppIcon-stage
|
||||||
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon-stage
|
||||||
@@ -384,7 +384,7 @@
|
|||||||
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
|
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
APP_NAME = "KROW With Us [STAGE] ";
|
APP_NAME = "KROW With Us [STAGE] ";
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-stage";
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
@@ -564,7 +564,7 @@
|
|||||||
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
|
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
APP_NAME = "KROW With Us [DEV] ";
|
APP_NAME = "KROW With Us [DEV] ";
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-dev";
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
@@ -666,7 +666,7 @@
|
|||||||
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
|
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
APP_NAME = "KROW With Us [DEV] ";
|
APP_NAME = "KROW With Us [DEV] ";
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-dev";
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
@@ -763,7 +763,7 @@
|
|||||||
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
|
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
APP_NAME = "KROW With Us [STAGE] ";
|
APP_NAME = "KROW With Us [STAGE] ";
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-stage";
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
@@ -954,7 +954,7 @@
|
|||||||
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
|
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
APP_NAME = "KROW With Us [DEV] ";
|
APP_NAME = "KROW With Us [DEV] ";
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-dev";
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
@@ -1045,7 +1045,7 @@
|
|||||||
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
|
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
APP_NAME = "KROW With Us [STAGE] ";
|
APP_NAME = "KROW With Us [STAGE] ";
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-stage";
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
@@ -1225,7 +1225,7 @@
|
|||||||
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
|
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
APP_NAME = "KROW With Us [DEV] ";
|
APP_NAME = "KROW With Us [DEV] ";
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-dev";
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
@@ -1314,7 +1314,7 @@
|
|||||||
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
|
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
APP_NAME = "KROW With Us [STAGE] ";
|
APP_NAME = "KROW With Us [STAGE] ";
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-stage";
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
{"images":[{"size":"20x20","idiom":"iphone","filename":"Icon-App-20x20@2x.png","scale":"2x"},{"size":"20x20","idiom":"iphone","filename":"Icon-App-20x20@3x.png","scale":"3x"},{"size":"29x29","idiom":"iphone","filename":"Icon-App-29x29@1x.png","scale":"1x"},{"size":"29x29","idiom":"iphone","filename":"Icon-App-29x29@2x.png","scale":"2x"},{"size":"29x29","idiom":"iphone","filename":"Icon-App-29x29@3x.png","scale":"3x"},{"size":"40x40","idiom":"iphone","filename":"Icon-App-40x40@2x.png","scale":"2x"},{"size":"40x40","idiom":"iphone","filename":"Icon-App-40x40@3x.png","scale":"3x"},{"size":"57x57","idiom":"iphone","filename":"Icon-App-57x57@1x.png","scale":"1x"},{"size":"57x57","idiom":"iphone","filename":"Icon-App-57x57@2x.png","scale":"2x"},{"size":"60x60","idiom":"iphone","filename":"Icon-App-60x60@2x.png","scale":"2x"},{"size":"60x60","idiom":"iphone","filename":"Icon-App-60x60@3x.png","scale":"3x"},{"size":"20x20","idiom":"ipad","filename":"Icon-App-20x20@1x.png","scale":"1x"},{"size":"20x20","idiom":"ipad","filename":"Icon-App-20x20@2x.png","scale":"2x"},{"size":"29x29","idiom":"ipad","filename":"Icon-App-29x29@1x.png","scale":"1x"},{"size":"29x29","idiom":"ipad","filename":"Icon-App-29x29@2x.png","scale":"2x"},{"size":"40x40","idiom":"ipad","filename":"Icon-App-40x40@1x.png","scale":"1x"},{"size":"40x40","idiom":"ipad","filename":"Icon-App-40x40@2x.png","scale":"2x"},{"size":"50x50","idiom":"ipad","filename":"Icon-App-50x50@1x.png","scale":"1x"},{"size":"50x50","idiom":"ipad","filename":"Icon-App-50x50@2x.png","scale":"2x"},{"size":"72x72","idiom":"ipad","filename":"Icon-App-72x72@1x.png","scale":"1x"},{"size":"72x72","idiom":"ipad","filename":"Icon-App-72x72@2x.png","scale":"2x"},{"size":"76x76","idiom":"ipad","filename":"Icon-App-76x76@1x.png","scale":"1x"},{"size":"76x76","idiom":"ipad","filename":"Icon-App-76x76@2x.png","scale":"2x"},{"size":"83.5x83.5","idiom":"ipad","filename":"Icon-App-83.5x83.5@2x.png","scale":"2x"},{"size":"1024x1024","idiom":"ios-marketing","filename":"Icon-App-1024x1024@1x.png","scale":"1x"}],"info":{"version":1,"author":"xcode"}}
|
||||||
|
After Width: | Height: | Size: 100 KiB |
|
After Width: | Height: | Size: 1.0 KiB |
|
After Width: | Height: | Size: 2.2 KiB |
|
After Width: | Height: | Size: 3.3 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 3.2 KiB |
|
After Width: | Height: | Size: 4.8 KiB |
|
After Width: | Height: | Size: 2.2 KiB |
|
After Width: | Height: | Size: 4.5 KiB |
|
After Width: | Height: | Size: 6.7 KiB |
|
After Width: | Height: | Size: 2.7 KiB |
|
After Width: | Height: | Size: 5.6 KiB |
|
After Width: | Height: | Size: 3.1 KiB |
|
After Width: | Height: | Size: 6.4 KiB |
|
After Width: | Height: | Size: 6.7 KiB |
|
After Width: | Height: | Size: 10 KiB |