implement data model binding

This commit is contained in:
2026-01-16 08:12:11 +01:00
parent 67b337b84e
commit ac5ca2beb6
18 changed files with 1219 additions and 551 deletions

View File

@@ -40,6 +40,11 @@
.browser-nav-btn.disabled {
color: #444444;
cursor: default;
}
.browser-nav-btn.disabled:hover {
background-color: transparent;
}
.browser-url-bar {
@@ -92,6 +97,10 @@
.browser-page-link {
color: #1a0dab;
cursor: pointer;
}
.browser-page-link:hover {
text-decoration: underline;
}
@@ -101,6 +110,11 @@
.browser-search-item {
margin-bottom: 24px;
cursor: pointer;
}
.browser-search-item:hover {
background-color: #f0f0f0;
}
.browser-search-title {
@@ -161,7 +175,7 @@
}
</style>
</head>
<body class="browser-screen">
<body class="browser-screen" data-model="browser">
<!-- Status Bar -->
<div class="status-bar">
<span class="status-bar-time">12:30</span>
@@ -174,34 +188,43 @@
<!-- Browser Toolbar -->
<div class="browser-toolbar">
<div class="browser-nav-btn" onclick="goBack()"><img src="../icons/back.tga" style="width: 24px; height: 24px;"/></div>
<div class="browser-nav-btn disabled"><img src="../icons/forward.tga" style="width: 24px; height: 24px; opacity: 0.3;"/></div>
<div class="browser-url-bar">
<input class="browser-url" type="text" value="example.com"/>
<div class="browser-nav-btn" data-class-disabled="!can_go_back" onclick="goBack()">
<img src="../icons/back.tga" style="width: 24px; height: 24px;"/>
</div>
<div class="browser-nav-btn disabled">
<img src="../icons/forward.tga" style="width: 24px; height: 24px; opacity: 0.3;"/>
</div>
<div class="browser-url-bar">
<span class="browser-secure-icon">🔒</span>
<input class="browser-url" type="text" data-value="current_url"/>
</div>
<div class="browser-nav-btn" data-event-click="refresh()">
<img src="../icons/refresh.tga" style="width: 24px; height: 24px;"/>
</div>
<div class="browser-nav-btn">
<img src="../icons/more.tga" style="width: 24px; height: 24px;"/>
</div>
<div class="browser-nav-btn"><img src="../icons/refresh.tga" style="width: 24px; height: 24px;"/></div>
<div class="browser-nav-btn"><img src="../icons/more.tga" style="width: 24px; height: 24px;"/></div>
</div>
<!-- Browser Content -->
<div class="browser-content">
<div class="browser-page">
<div class="browser-page-title">Example Domain</div>
<div class="browser-page-title">{{ page_title }}</div>
<div class="browser-page-text">
This domain is for use in illustrative examples in documents. You may use this domain in literature without prior coordination or asking for permission.
{{ page_content }}
</div>
<div class="browser-page-text">
<span class="browser-page-link">More information...</span>
<span class="browser-page-link" data-event-click="navigate('iana.org')">More information...</span>
</div>
<div style="margin-top: 32px; padding-top: 16px; border-top: 1px solid #e0e0e0;">
<div class="browser-page-title" style="font-size: 18px;">Related Links</div>
<div class="browser-search-item">
<div class="browser-search-item" data-event-click="navigate('iana.org/domains')">
<div class="browser-search-title">IANA — IANA-managed Reserved Domains</div>
<div class="browser-search-url">www.iana.org > domains > reserved</div>
<div class="browser-search-desc">Certain domains are set aside and unavailable for registration. Learn about reserved top-level domains.</div>
</div>
<div class="browser-search-item">
<div class="browser-search-item" data-event-click="navigate('tools.ietf.org/html/rfc2606')">
<div class="browser-search-title">RFC 2606 - Reserved Top Level DNS Names</div>
<div class="browser-search-url">tools.ietf.org > html > rfc2606</div>
<div class="browser-search-desc">This document describes some domain names that are reserved for documentation purposes.</div>
@@ -217,7 +240,7 @@
<span class="browser-tab-label">Home</span>
</div>
<div class="browser-tab-btn">
<span class="browser-tabs-indicator">3</span>
<span class="browser-tabs-indicator">{{ tabs.size }}</span>
<span class="browser-tab-label">Tabs</span>
</div>
<div class="browser-tab-btn">

126
assets/screens/calling.rml Normal file
View File

@@ -0,0 +1,126 @@
<rml>
<head>
<link type="text/rcss" href="../ui/html.rcss"/>
<link type="text/rcss" href="../ui/theme.rcss"/>
<link type="text/rcss" href="../ui/components.rcss"/>
<script src="../scripts/navigation.lua"></script>
<script src="../scripts/phone.lua"></script>
<title>Calling</title>
<style>
.calling-screen {
width: 100%;
height: 100%;
background: linear-gradient(180deg, #1a237e 0%, #121212 100%);
display: flex;
flex-direction: column;
align-items: center;
}
.calling-status {
margin-top: 80px;
font-size: 14px;
color: #4CAF50;
text-transform: uppercase;
letter-spacing: 2px;
}
.calling-name {
margin-top: 24px;
font-size: 32px;
font-weight: 300;
color: #FFFFFF;
}
.calling-number {
margin-top: 8px;
font-size: 16px;
color: #B3B3B3;
}
.calling-avatar {
margin-top: 48px;
width: 120px;
height: 120px;
border-radius: 60px;
background-color: #BB86FC;
display: flex;
align-items: center;
justify-content: center;
font-size: 48px;
color: #000000;
}
.calling-actions {
position: absolute;
bottom: 120px;
display: flex;
gap: 48px;
}
.call-action-btn {
width: 64px;
height: 64px;
border-radius: 32px;
background-color: rgba(255, 255, 255, 0.1);
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
}
.call-action-btn:hover {
background-color: rgba(255, 255, 255, 0.2);
}
.call-action-btn img {
width: 28px;
height: 28px;
pointer-events: none;
}
.end-call-btn {
position: absolute;
bottom: 40px;
width: 72px;
height: 72px;
border-radius: 36px;
background-color: #F44336;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
}
.end-call-btn:hover {
background-color: #E53935;
}
.end-call-btn img {
width: 32px;
height: 32px;
pointer-events: none;
transform: rotate(135deg);
}
</style>
</head>
<body class="calling-screen">
<div class="calling-status">Calling...</div>
<div class="calling-name" id="calling-name">Unknown</div>
<div class="calling-number" id="calling-number"></div>
<div class="calling-avatar" id="calling-avatar">?</div>
<div class="calling-actions">
<div class="call-action-btn">
<img src="../icons/dialpad.tga"/>
</div>
<div class="call-action-btn">
<img src="../icons/contacts.tga"/>
</div>
</div>
<div class="end-call-btn" onclick="endCall()">
<img src="../icons/phone.tga"/>
</div>
</body>
</rml>

164
assets/screens/chat.rml Normal file
View File

@@ -0,0 +1,164 @@
<rml>
<head>
<link type="text/rcss" href="../ui/html.rcss"/>
<link type="text/rcss" href="../ui/theme.rcss"/>
<link type="text/rcss" href="../ui/components.rcss"/>
<script src="../scripts/navigation.lua"></script>
<script src="../scripts/messages.lua"></script>
<title>Chat</title>
<style>
.chat-screen {
width: 100%;
height: 100%;
background-color: #121212;
display: flex;
flex-direction: column;
}
.chat-header {
display: flex;
align-items: center;
padding: 8px 16px;
background-color: #1E1E1E;
}
.chat-avatar {
width: 40px;
height: 40px;
border-radius: 20px;
margin-right: 12px;
display: flex;
align-items: center;
justify-content: center;
font-size: 18px;
color: #000000;
}
.chat-header-info {
flex: 1;
}
.chat-header-name {
font-size: 16px;
font-weight: 500;
color: #FFFFFF;
}
.chat-header-status {
font-size: 12px;
color: #4CAF50;
}
.chat-messages {
flex: 1;
overflow: auto;
padding: 16px;
display: flex;
flex-direction: column;
gap: 8px;
}
.message-bubble {
max-width: 75%;
padding: 10px 14px;
border-radius: 18px;
font-size: 14px;
line-height: 1.4;
}
.message-sent {
align-self: flex-end;
background-color: #BB86FC;
color: #000000;
border-bottom-right-radius: 4px;
}
.message-received {
align-self: flex-start;
background-color: #2D2D2D;
color: #FFFFFF;
border-bottom-left-radius: 4px;
}
.message-time {
font-size: 11px;
color: #666666;
margin-top: 4px;
text-align: right;
}
.message-time-received {
text-align: left;
}
.chat-input-bar {
display: flex;
align-items: center;
padding: 8px 16px;
background-color: #1E1E1E;
gap: 8px;
}
.chat-input {
flex: 1;
padding: 10px 16px;
background-color: #2D2D2D;
border-radius: 24px;
color: #FFFFFF;
font-size: 14px;
}
.chat-send-btn {
width: 44px;
height: 44px;
border-radius: 22px;
background-color: #BB86FC;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
}
.chat-send-btn:hover {
background-color: #9C64FC;
}
.chat-send-btn img {
width: 20px;
height: 20px;
pointer-events: none;
}
</style>
</head>
<body class="chat-screen">
<!-- Chat Header -->
<div class="app-bar">
<div class="btn-icon" onclick="goBack()"><img src="../icons/back.tga" style="width: 24px; height: 24px;"/></div>
<div class="chat-avatar" id="chat-avatar" style="background-color: #4CAF50;">J</div>
<div class="chat-header-info">
<div class="chat-header-name" id="chat-name">John Wilson</div>
<div class="chat-header-status">Online</div>
</div>
<div class="btn-icon"><img src="../icons/phone.tga" style="width: 24px; height: 24px;"/></div>
<div class="btn-icon"><img src="../icons/more.tga" style="width: 24px; height: 24px;"/></div>
</div>
<!-- Messages -->
<div class="chat-messages" id="chat-messages">
<div class="message-bubble message-received">Hey!</div>
<div class="message-bubble message-received">What are you up to?</div>
<div class="message-bubble message-sent">Not much, just working</div>
<div class="message-bubble message-received">Cool! There's a party at Mike's tonight</div>
<div class="message-bubble message-received">Hey, are you coming to the party tonight?</div>
</div>
<!-- Input Bar -->
<div class="chat-input-bar">
<div class="btn-icon"><img src="../icons/add.tga" style="width: 24px; height: 24px;"/></div>
<input class="chat-input" type="text" placeholder="Type a message..." id="message-input"/>
<div class="chat-send-btn">
<img src="../icons/send.tga"/>
</div>
</div>
</body>
</rml>

View File

@@ -0,0 +1,161 @@
<rml>
<head>
<link type="text/rcss" href="../ui/html.rcss"/>
<link type="text/rcss" href="../ui/theme.rcss"/>
<link type="text/rcss" href="../ui/components.rcss"/>
<script src="../scripts/navigation.lua"></script>
<script src="../scripts/phone.lua"></script>
<script src="../scripts/contacts.lua"></script>
<title>Contact</title>
<style>
.contact-detail-screen {
width: 100%;
height: 100%;
background-color: #121212;
display: flex;
flex-direction: column;
}
.contact-header {
background: linear-gradient(180deg, #1E1E1E 0%, #121212 100%);
padding: 24px;
display: flex;
flex-direction: column;
align-items: center;
}
.contact-avatar-large {
width: 96px;
height: 96px;
border-radius: 48px;
background-color: #BB86FC;
display: flex;
align-items: center;
justify-content: center;
font-size: 40px;
color: #000000;
margin-bottom: 16px;
}
.contact-name-large {
font-size: 24px;
font-weight: 500;
color: #FFFFFF;
margin-bottom: 8px;
}
.contact-actions {
display: flex;
gap: 32px;
margin-top: 24px;
}
.contact-action {
display: flex;
flex-direction: column;
align-items: center;
cursor: pointer;
}
.contact-action-icon {
width: 48px;
height: 48px;
border-radius: 24px;
background-color: #BB86FC;
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 8px;
}
.contact-action-icon img {
width: 24px;
height: 24px;
pointer-events: none;
}
.contact-action-label {
font-size: 12px;
color: #B3B3B3;
}
.contact-info-section {
padding: 16px;
}
.contact-info-item {
display: flex;
align-items: center;
padding: 16px 0;
}
.contact-info-icon {
width: 24px;
height: 24px;
margin-right: 16px;
}
.contact-info-content {
flex: 1;
}
.contact-info-label {
font-size: 12px;
color: #B3B3B3;
}
.contact-info-value {
font-size: 16px;
color: #FFFFFF;
margin-top: 4px;
}
</style>
</head>
<body class="contact-detail-screen" onload="updateContactDetail()">
<!-- App Bar -->
<div class="app-bar">
<div class="btn-icon" onclick="goBack()"><img src="../icons/back.tga" style="width: 24px; height: 24px;"/></div>
<span class="app-bar-title">Contact</span>
<div class="btn-icon"><img src="../icons/more.tga" style="width: 24px; height: 24px;"/></div>
</div>
<!-- Contact Header -->
<div class="contact-header">
<div class="contact-avatar-large" id="contact-avatar">?</div>
<div class="contact-name-large" id="contact-name">Contact Name</div>
<div class="contact-actions">
<div class="contact-action" id="call-action">
<div class="contact-action-icon" style="background-color: #4CAF50;">
<img src="../icons/phone.tga"/>
</div>
<span class="contact-action-label">Call</span>
</div>
<div class="contact-action" id="message-action">
<div class="contact-action-icon" style="background-color: #2196F3;">
<img src="../icons/message.tga"/>
</div>
<span class="contact-action-label">Message</span>
</div>
</div>
</div>
<!-- Contact Info -->
<div class="contact-info-section">
<div class="contact-info-item">
<img src="../icons/phone.tga" class="contact-info-icon" style="width: 24px; height: 24px;"/>
<div class="contact-info-content">
<div class="contact-info-label">Mobile</div>
<div class="contact-info-value" id="contact-phone">+1 (555) 000-0000</div>
</div>
</div>
<div class="contact-info-item">
<img src="../icons/message.tga" class="contact-info-icon" style="width: 24px; height: 24px;"/>
<div class="contact-info-content">
<div class="contact-info-label">Email</div>
<div class="contact-info-value" id="contact-email">email@example.com</div>
</div>
</div>
</div>
</body>
</rml>

View File

@@ -67,9 +67,29 @@
color: #B3B3B3;
margin-top: 2px;
}
.contact-call-btn {
width: 40px;
height: 40px;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
border-radius: 20px;
}
.contact-call-btn:hover {
background-color: rgba(76, 175, 80, 0.2);
}
.contact-call-btn img {
width: 20px;
height: 20px;
pointer-events: none;
}
</style>
</head>
<body class="contacts-screen">
<body class="contacts-screen" data-model="contacts">
<!-- App Bar -->
<div class="app-bar">
<div class="btn-icon" onclick="goBack()"><img src="../icons/back.tga" style="width: 24px; height: 24px;"/></div>
@@ -85,94 +105,16 @@
<!-- Contacts List -->
<div class="contacts-list">
<!-- A -->
<div class="contact-letter">A</div>
<div class="contact-item">
<div class="contact-avatar" style="background-color: #E91E63;">A</div>
<div class="contact-info">
<div class="contact-name">Alice Johnson</div>
<div class="contact-phone">+1 (555) 123-4567</div>
</div>
</div>
<div class="contact-item">
<div class="contact-avatar" style="background-color: #9C27B0;">A</div>
<div class="contact-info">
<div class="contact-name">Andrew Smith</div>
<div class="contact-phone">+1 (555) 234-5678</div>
</div>
</div>
<!-- B -->
<div class="contact-letter">B</div>
<div class="contact-item">
<div class="contact-avatar" style="background-color: #2196F3;">B</div>
<div class="contact-info">
<div class="contact-name">Bob Williams</div>
<div class="contact-phone">+1 (555) 345-6789</div>
</div>
</div>
<div class="contact-item">
<div class="contact-avatar" style="background-color: #00BCD4;">B</div>
<div class="contact-info">
<div class="contact-name">Brian Davis</div>
<div class="contact-phone">+1 (555) 456-7890</div>
</div>
</div>
<!-- C -->
<div class="contact-letter">C</div>
<div class="contact-item">
<div class="contact-avatar" style="background-color: #4CAF50;">C</div>
<div class="contact-info">
<div class="contact-name">Carol Martinez</div>
<div class="contact-phone">+1 (555) 567-8901</div>
</div>
</div>
<!-- D -->
<div class="contact-letter">D</div>
<div class="contact-item">
<div class="contact-avatar" style="background-color: #FF9800;">D</div>
<div class="contact-info">
<div class="contact-name">David Lee</div>
<div class="contact-phone">+1 (555) 678-9012</div>
</div>
</div>
<!-- J -->
<div class="contact-letter">J</div>
<div class="contact-item">
<div class="contact-avatar" style="background-color: #F44336;">J</div>
<div class="contact-info">
<div class="contact-name">John Wilson</div>
<div class="contact-phone">+1 (555) 789-0123</div>
</div>
</div>
<!-- M -->
<div class="contact-letter">M</div>
<div class="contact-item">
<div class="contact-avatar" style="background-color: #673AB7;">M</div>
<div class="contact-info">
<div class="contact-name">Mom</div>
<div class="contact-phone">+1 (555) 890-1234</div>
</div>
</div>
<div class="contact-item">
<div class="contact-avatar" style="background-color: #3F51B5;">M</div>
<div class="contact-info">
<div class="contact-name">Mike Brown</div>
<div class="contact-phone">+1 (555) 901-2345</div>
</div>
</div>
<!-- S -->
<div class="contact-letter">S</div>
<div class="contact-item">
<div class="contact-avatar" style="background-color: #009688;">S</div>
<div class="contact-info">
<div class="contact-name">Sarah Taylor</div>
<div class="contact-phone">+1 (555) 012-3456</div>
<div data-for="contact : contacts">
<div class="contact-item" data-event-click="select_contact(contact.id); navigateTo('contact_detail')">
<div class="contact-avatar" data-style-background-color="contact.color">{{ contact.initial }}</div>
<div class="contact-info">
<div class="contact-name">{{ contact.name }}</div>
<div class="contact-phone">{{ contact.phone }}</div>
</div>
<div class="contact-call-btn">
<img src="../icons/phone.tga"/>
</div>
</div>
</div>
</div>

View File

@@ -4,7 +4,6 @@
<link type="text/rcss" href="../ui/theme.rcss"/>
<link type="text/rcss" href="../ui/components.rcss"/>
<script src="../scripts/navigation.lua"></script>
<script src="../scripts/phone.lua"></script>
<title>Phone</title>
<style>
.dialer-screen {
@@ -105,7 +104,7 @@
}
</style>
</head>
<body class="dialer-screen">
<body class="dialer-screen" data-model="phone">
<!-- App Bar -->
<div class="app-bar">
<div class="btn-icon" onclick="goBack()"><img src="../icons/back.tga" style="width: 24px; height: 24px;"/></div>
@@ -114,69 +113,71 @@
<!-- Tabs -->
<div class="dialer-tabs">
<div class="dialer-tab" id="tab-keypad">Keypad</div>
<div class="dialer-tab active" id="tab-recent">Recent</div>
<div class="dialer-tab" id="tab-contacts">Contacts</div>
<div class="dialer-tab active" id="tab-keypad">Keypad</div>
<div class="dialer-tab" id="tab-recent">Recent</div>
<div class="dialer-tab" onclick="navigateTo('contacts')">Contacts</div>
</div>
<!-- Dial Display -->
<div class="dial-display" id="dial-display"></div>
<div class="dial-display">{{ dial_number }}</div>
<!-- Dial Pad -->
<div class="dial-pad">
<div class="dial-key" onclick="dialPress('1')">
<div class="dial-key" data-event-click="dial_press('1')">
<span class="dial-key-number">1</span>
<span class="dial-key-letters"></span>
</div>
<div class="dial-key" onclick="dialPress('2')">
<div class="dial-key" data-event-click="dial_press('2')">
<span class="dial-key-number">2</span>
<span class="dial-key-letters">ABC</span>
</div>
<div class="dial-key" onclick="dialPress('3')">
<div class="dial-key" data-event-click="dial_press('3')">
<span class="dial-key-number">3</span>
<span class="dial-key-letters">DEF</span>
</div>
<div class="dial-key" onclick="dialPress('4')">
<div class="dial-key" data-event-click="dial_press('4')">
<span class="dial-key-number">4</span>
<span class="dial-key-letters">GHI</span>
</div>
<div class="dial-key" onclick="dialPress('5')">
<div class="dial-key" data-event-click="dial_press('5')">
<span class="dial-key-number">5</span>
<span class="dial-key-letters">JKL</span>
</div>
<div class="dial-key" onclick="dialPress('6')">
<div class="dial-key" data-event-click="dial_press('6')">
<span class="dial-key-number">6</span>
<span class="dial-key-letters">MNO</span>
</div>
<div class="dial-key" onclick="dialPress('7')">
<div class="dial-key" data-event-click="dial_press('7')">
<span class="dial-key-number">7</span>
<span class="dial-key-letters">PQRS</span>
</div>
<div class="dial-key" onclick="dialPress('8')">
<div class="dial-key" data-event-click="dial_press('8')">
<span class="dial-key-number">8</span>
<span class="dial-key-letters">TUV</span>
</div>
<div class="dial-key" onclick="dialPress('9')">
<div class="dial-key" data-event-click="dial_press('9')">
<span class="dial-key-number">9</span>
<span class="dial-key-letters">WXYZ</span>
</div>
<div class="dial-key" onclick="dialPress('*')">
<div class="dial-key" data-event-click="dial_press('*')">
<span class="dial-key-number">*</span>
<span class="dial-key-letters"></span>
</div>
<div class="dial-key" onclick="dialPress('0')">
<div class="dial-key" data-event-click="dial_press('0')">
<span class="dial-key-number">0</span>
<span class="dial-key-letters">+</span>
</div>
<div class="dial-key" onclick="dialPress('#')">
<div class="dial-key" data-event-click="dial_press('#')">
<span class="dial-key-number">#</span>
<span class="dial-key-letters"></span>
</div>
</div>
<!-- Call Button -->
<!-- Call Actions -->
<div class="dial-actions">
<div class="dial-call-btn" onclick="makeCall()"><img src="../icons/call_small.tga" style="width: 32px; height: 32px;"/></div>
<div style="width: 56px;"></div>
<div class="dial-call-btn" data-event-click="make_call()"><img src="../icons/call_small.tga" style="width: 32px; height: 32px; pointer-events: none;"/></div>
<div class="btn-icon" data-event-click="dial_backspace()" style="width: 56px; height: 56px;"><img src="../icons/backspace.tga" style="width: 24px; height: 24px; pointer-events: none;"/></div>
</div>
<!-- Bottom Navigation -->

View File

@@ -86,50 +86,9 @@
justify-content: center;
margin-left: 8px;
}
/* Chat View Styles */
.chat-header {
display: flex;
align-items: center;
padding: 8px 0;
}
.chat-header-avatar {
width: 36px;
height: 36px;
border-radius: 18px;
background-color: #BB86FC;
margin-right: 12px;
display: flex;
align-items: center;
justify-content: center;
font-size: 16px;
color: #000000;
}
.chat-header-info {
flex: 1;
}
.chat-header-name {
font-size: 16px;
font-weight: 500;
color: #FFFFFF;
}
.chat-header-status {
font-size: 12px;
color: #B3B3B3;
}
.chat-messages {
flex: 1;
overflow: auto;
padding: 16px;
}
</style>
</head>
<body class="messages-screen">
<body class="messages-screen" data-model="messages">
<!-- App Bar -->
<div class="app-bar">
<div class="btn-icon" onclick="goBack()"><img src="../icons/back.tga" style="width: 24px; height: 24px;"/></div>
@@ -139,82 +98,16 @@
<!-- Conversations List -->
<div class="conversations-list">
<div class="conversation-item">
<div class="conversation-avatar" style="background-color: #4CAF50;">J</div>
<div class="conversation-item" data-for="conv : conversations" data-event-click="select_conversation(conv.id); navigateTo('chat')">
<div class="conversation-avatar" data-style-background-color="conv.color">{{ conv.name | slice(0, 1) }}</div>
<div class="conversation-content">
<div class="conversation-header">
<span class="conversation-name">John Wilson</span>
<span class="conversation-time">2:30 PM</span>
<span class="conversation-name">{{ conv.name }}</span>
<span class="conversation-time">{{ conv.time }}</span>
</div>
<div class="conversation-preview">Hey, are you coming to the party tonight?</div>
</div>
<div class="conversation-unread">2</div>
</div>
<div class="conversation-item">
<div class="conversation-avatar" style="background-color: #673AB7;">M</div>
<div class="conversation-content">
<div class="conversation-header">
<span class="conversation-name">Mom</span>
<span class="conversation-time">1:15 PM</span>
</div>
<div class="conversation-preview">Don't forget to call your grandmother!</div>
</div>
</div>
<div class="conversation-item">
<div class="conversation-avatar" style="background-color: #E91E63;">A</div>
<div class="conversation-content">
<div class="conversation-header">
<span class="conversation-name">Alice Johnson</span>
<span class="conversation-time">Yesterday</span>
</div>
<div class="conversation-preview">Thanks for the help with the project!</div>
</div>
</div>
<div class="conversation-item">
<div class="conversation-avatar" style="background-color: #2196F3;">B</div>
<div class="conversation-content">
<div class="conversation-header">
<span class="conversation-name">Bob Williams</span>
<span class="conversation-time">Yesterday</span>
</div>
<div class="conversation-preview">Did you see the game last night?</div>
</div>
</div>
<div class="conversation-item">
<div class="conversation-avatar" style="background-color: #FF9800;">W</div>
<div class="conversation-content">
<div class="conversation-header">
<span class="conversation-name">Work Group</span>
<span class="conversation-time">Mon</span>
</div>
<div class="conversation-preview">Sarah: Meeting moved to 3pm</div>
</div>
</div>
<div class="conversation-item">
<div class="conversation-avatar" style="background-color: #009688;">S</div>
<div class="conversation-content">
<div class="conversation-header">
<span class="conversation-name">Sarah Taylor</span>
<span class="conversation-time">Sun</span>
</div>
<div class="conversation-preview">See you at the coffee shop!</div>
</div>
</div>
<div class="conversation-item">
<div class="conversation-avatar" style="background-color: #F44336;">D</div>
<div class="conversation-content">
<div class="conversation-header">
<span class="conversation-name">David Lee</span>
<span class="conversation-time">Sat</span>
</div>
<div class="conversation-preview">Great talking to you!</div>
<div class="conversation-preview">{{ conv.last_message }}</div>
</div>
<div class="conversation-unread" data-if="conv.unread > 0">{{ conv.unread }}</div>
</div>
</div>

View File

@@ -83,6 +83,7 @@
border-radius: 12px;
background-color: #666666;
position: relative;
cursor: pointer;
}
.settings-toggle.active {
@@ -147,7 +148,7 @@
}
</style>
</head>
<body class="settings-screen">
<body class="settings-screen" data-model="settings">
<!-- App Bar -->
<div class="app-bar">
<div class="btn-icon" onclick="goBack()"><img src="../icons/back.tga" style="width: 24px; height: 24px;"/></div>
@@ -161,8 +162,8 @@
<div class="user-card">
<div class="user-avatar">U</div>
<div class="user-info">
<div class="user-name">User Name</div>
<div class="user-email">user@example.com</div>
<div class="user-name">{{ user_name }}</div>
<div class="user-email">{{ user_email }}</div>
</div>
<span class="settings-action">></span>
</div>
@@ -174,9 +175,10 @@
<div class="settings-icon">W</div>
<div class="settings-content">
<div class="settings-title">Wi-Fi</div>
<div class="settings-subtitle">Connected to Home_Network</div>
<div class="settings-subtitle" data-if="wifi">Connected to {{ wifi_network }}</div>
<div class="settings-subtitle" data-if="!wifi">Off</div>
</div>
<div class="settings-toggle active">
<div class="settings-toggle" data-class-active="wifi" data-event-click="wifi = !wifi">
<div class="settings-toggle-thumb"></div>
</div>
</div>
@@ -184,9 +186,10 @@
<div class="settings-icon">B</div>
<div class="settings-content">
<div class="settings-title">Bluetooth</div>
<div class="settings-subtitle">Off</div>
<div class="settings-subtitle" data-if="bluetooth">On</div>
<div class="settings-subtitle" data-if="!bluetooth">Off</div>
</div>
<div class="settings-toggle">
<div class="settings-toggle" data-class-active="bluetooth" data-event-click="bluetooth = !bluetooth">
<div class="settings-toggle-thumb"></div>
</div>
</div>
@@ -195,7 +198,7 @@
<div class="settings-content">
<div class="settings-title">Airplane Mode</div>
</div>
<div class="settings-toggle">
<div class="settings-toggle" data-class-active="airplane_mode" data-event-click="airplane_mode = !airplane_mode">
<div class="settings-toggle-thumb"></div>
</div>
</div>
@@ -232,7 +235,7 @@
<div class="settings-icon">B</div>
<div class="settings-content">
<div class="settings-title">Battery</div>
<div class="settings-subtitle">85% - About 12h remaining</div>
<div class="settings-subtitle">{{ battery_percent }}% - {{ battery_remaining }}</div>
</div>
<span class="settings-action">></span>
</div>
@@ -240,7 +243,7 @@
<div class="settings-icon">S</div>
<div class="settings-content">
<div class="settings-title">Storage</div>
<div class="settings-subtitle">45.2 GB used of 128 GB</div>
<div class="settings-subtitle">{{ storage_used }}</div>
</div>
<span class="settings-action">></span>
</div>
@@ -269,9 +272,10 @@
<div class="settings-icon">L</div>
<div class="settings-content">
<div class="settings-title">Location</div>
<div class="settings-subtitle">On - High accuracy</div>
<div class="settings-subtitle" data-if="location">On - High accuracy</div>
<div class="settings-subtitle" data-if="!location">Off</div>
</div>
<div class="settings-toggle active">
<div class="settings-toggle" data-class-active="location" data-event-click="location = !location">
<div class="settings-toggle-thumb"></div>
</div>
</div>

View File

@@ -6,8 +6,11 @@ local screens = {
home = "screens/home.rml",
lock = "screens/lock.rml",
dialer = "screens/dialer.rml",
calling = "screens/calling.rml",
contacts = "screens/contacts.rml",
contact_detail = "screens/contact_detail.rml",
messages = "screens/messages.rml",
chat = "screens/chat.rml",
settings = "screens/settings.rml",
browser = "screens/browser.rml"
}

View File

@@ -1,80 +0,0 @@
-- Phone/Dialer functionality for Virtual Smartphone
-- Dial pad state
local dial_number = ""
local max_digits = 15
-- Add a digit to the dial display
function dialPress(digit)
if #dial_number < max_digits then
dial_number = dial_number .. digit
updateDialDisplay()
print("Dialed: " .. digit .. " | Number: " .. dial_number)
end
end
-- Clear the last digit
function dialBackspace()
if #dial_number > 0 then
dial_number = dial_number:sub(1, -2)
updateDialDisplay()
print("Backspace | Number: " .. dial_number)
end
end
-- Clear all digits
function dialClear()
dial_number = ""
updateDialDisplay()
print("Cleared dial pad")
end
-- Update the dial display element
function updateDialDisplay()
local display = document:GetElementById("dial-display")
if display then
-- Format number with dashes for readability
local formatted = formatPhoneNumber(dial_number)
display.inner_rml = formatted
end
end
-- Format phone number for display
function formatPhoneNumber(number)
local len = #number
if len == 0 then
return ""
elseif len <= 3 then
return number
elseif len <= 6 then
return number:sub(1, 3) .. "-" .. number:sub(4)
elseif len <= 10 then
return "(" .. number:sub(1, 3) .. ") " .. number:sub(4, 6) .. "-" .. number:sub(7)
else
return "+1 (" .. number:sub(1, 3) .. ") " .. number:sub(4, 6) .. "-" .. number:sub(7, 10)
end
end
-- Make a call (simulated)
function makeCall()
if #dial_number > 0 then
print("Calling: " .. dial_number)
-- In a real app, this would initiate a call
-- For now, just show feedback
else
print("No number to call")
end
end
-- End a call (simulated)
function endCall()
print("Call ended")
dialClear()
end
-- Get the current dial number
function getDialNumber()
return dial_number
end
print("Phone system initialized")