Publish Vulpes Preview 15 sources for desktop, Android and Tundra

Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
This commit is contained in:
OverSu 2026-09-30 23:13:03 +02:00
commit b38dea0597
25901 changed files with 9982925 additions and 369 deletions

View file

@ -0,0 +1,321 @@
/* ----------------------------------
* Action menu
* ---------------------------------- */
html[dir="ltr"] [role="dialog"][data-type="action"] [dir],
html[dir="ltr"] [role="dialog"][data-type="action"] button {
text-align: left;
}
html[dir="rtl"] [role="dialog"][data-type="action"] [dir],
html[dir="rtl"] [role="dialog"][data-type="action"] button {
text-align: right;
}
/* Main dialog setup */
[role="dialog"][data-type="action"] {
background: #2d2d2d;
overflow: hidden;
position: fixed;
z-index: 100;
top: 0;
left: 0;
right: 0;
bottom: 0;
padding: 0 0 7rem;
/**
* Using "font-size: 0" to avoid the unwanted visual space (about 3px) created
* by white spaces and line breaks in the code between inline-block elements.
*/
font-size: 0;
color: #fff;
}
[role="dialog"][data-type="action"]:before {
content: '';
display: inline-block;
vertical-align: top;
width: 0.1rem;
height: 100%;
margin-inline-start: -0.1rem;
}
[role="dialog"][data-type="action"] > header {
box-sizing: border-box;
font-size: 1.6rem;
position: absolute;
top: 0;
left: 0;
right: 0;
z-index: 10;
height: 5rem;
line-height: 4.9rem;
color: #fff;
white-space: nowrap;
text-overflow: ellipsis;
display: block;
overflow: hidden;
font-weight: normal;
padding: 0 3rem;
border-bottom: 0.1rem solid #616262;
}
[role="dialog"][data-type="action"] > header * {
overflow: hidden;
text-overflow: ellipsis;
}
[role="dialog"][data-type="action"] > header h1 {
font-size: 1.6rem;
line-height: 4.9rem;
color: #fff;
white-space: nowrap;
text-overflow: ellipsis;
display: block;
overflow: hidden;
margin: 0;
height: 100%;
font-weight: normal;
}
/* Generic set of actions in toolbar */
[role="dialog"][data-type="action"] > header menu[type="toolbar"] {
height: 100%;
margin: 0 -3rem;
margin-inline-start: 1rem;
padding: 0;
}
html[dir="ltr"] [role="dialog"][data-type="action"] > header menu[type="toolbar"] { float: right; }
html[dir="rtl"] [role="dialog"][data-type="action"] > header menu[type="toolbar"] { float: left; }
[role="dialog"][data-type="action"] > header menu[type="toolbar"] a,
[role="dialog"][data-type="action"] > header menu[type="toolbar"] button {
box-sizing: border-box;
position: relative;
width: auto;
min-width: 5rem;
height: 4.9rem;
margin-bottom: 0;
padding: 0 1rem;
border-radius: 0;
line-height: 4.9rem;
background: none;
text-align: center;
text-shadow: none;
z-index: 5;
}
html[dir="ltr"] [role="dialog"][data-type="action"] > header menu[type="toolbar"] a,
html[dir="ltr"] [role="dialog"][data-type="action"] > header menu[type="toolbar"] button {
float: left;
}
html[dir="rtl"] [role="dialog"][data-type="action"] > header menu[type="toolbar"] a,
html[dir="rtl"] [role="dialog"][data-type="action"] > header menu[type="toolbar"] button {
float: right;
}
[role="dialog"][data-type="action"] > header a,
[role="dialog"][data-type="action"] > header button {
border: none;
padding: 0;
overflow: hidden;
font-weight: 400;
font-size: 1.5rem;
line-height: 1.1em;
color: #fff;
border-radius: 0;
text-decoration: none;
}
[role="dialog"][data-type="action"] button::-moz-focus-inner {
outline: none;
border: none;
}
/* Pressed state */
[role="dialog"][data-type="action"] > header a:active .icon:after,
[role="dialog"][data-type="action"] > header button:active .icon:after,
[role="dialog"][data-type="action"] > header menu[type="toolbar"] a:active,
[role="dialog"][data-type="action"] > header menu[type="toolbar"] button:active {
background: #008aaa !important;
}
/* Disabled state */
[role="dialog"][data-type="action"] > header menu[type="toolbar"] a[aria-disabled="true"],
[role="dialog"][data-type="action"] > header menu[type="toolbar"] button[disabled] {
opacity: 0.5;
pointer-events: none;
}
/* Icon definitions */
[role="dialog"][data-type="action"] > header .icon {
position: relative;
float: none;
display: inline-block;
vertical-align: top;
width: 4rem;
height: 4.9rem;
margin: 0 -1rem;
background: transparent no-repeat center center / 3rem auto;
font-size: 0;
overflow: hidden;
}
[role="dialog"][data-type="action"] > header .icon.icon-close {
background-image: url(action_menu/images/icons/close.png);
}
html[dir="ltr"] [role="dialog"][data-type="action"] > header .icon.icon-back {
background-image: url(action_menu/images/icons/left.png);
}
html[dir="rtl"] [role="dialog"][data-type="action"] > header .icon.icon-back {
background-image: url(action_menu/images/icons/right.png);
}
/* Navigation links (back, cancel, etc) */
[role="dialog"][data-type="action"] > header > button,
[role="dialog"][data-type="action"] > header > a {
width: 5rem;
height: 4.9rem;
background: none;
overflow: visible;
margin: 0 -1rem;
margin-inline-start: -3rem;
position: relative;
}
html[dir="ltr"] [role="dialog"][data-type="action"] > header > button,
html[dir="ltr"] [role="dialog"][data-type="action"] > header > a {
float: left;
}
html[dir="rtl"] [role="dialog"][data-type="action"] > header > button,
html[dir="rtl"] [role="dialog"][data-type="action"] > header > a {
float: right;
}
[role="dialog"][data-type="action"] > header > button::-moz-focus-inner {
border: 0;
padding: 0;
}
[role="dialog"][data-type="action"] > header > button .icon,
[role="dialog"][data-type="action"] > header > a .icon {
position: static;
display: block;
width: 3rem;
height: 4.9rem;
margin: 0;
overflow: visible;
font-size: 0;
}
[role="dialog"][data-type="action"] > header > button .icon:after,
[role="dialog"][data-type="action"] > header > a .icon:after {
content: "";
position: absolute;
offset-inline-start: 0;
top: 0;
z-index: -1;
width: 3rem;
height: 4.9rem;
}
/* Content */
[role="dialog"][data-type="action"] > section {
color: #fff;
position: absolute;
top: 7rem;
left: 1.5rem;
right: 1.5rem;
bottom: 2rem;
font-size: 1.6rem;
overflow: scroll;
}
/* Specific component code */
[role="dialog"][data-type="action"] > menu {
margin: 0;
padding: 0;
max-height: calc(100% - 13.5rem); /*header(5rem) + footer(7rem) + padding(1.5rem)*/
height: auto;
padding-top: 1.5rem;
overflow: auto;
width: auto;
border: none;
background: none;
position: absolute;
left: 0;
right: 0;
bottom: 7rem;
}
[role="dialog"][data-type="action"] > menu > button {
width: calc(100% - 3rem);
height: 4rem;
box-sizing: border-box;
vertical-align: middle;
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
font-weight: normal;
line-height: 4rem;
outline: none;
font-size: 1.6rem;
text-shadow: none;
padding: 0 1.2rem;
margin: 0 1.5rem 1rem;
background: rgba(87, 87, 87, 0.8);
border: none;
border-radius: 0;
position: relative;
color: #fff;
font-family: sans-serif;
font-style: italic;
}
[role="dialog"][data-type="action"] > menu > .last-button-container {
position: fixed;
width: 100%;
background-color: #4d4d4d;
height: 7rem;
offset-inline-start: 0;
bottom: 0;
}
[role="dialog"][data-type="action"] > menu > .last-button-container button {
width: calc(100% - 3rem);
position: fixed;
bottom: 0;
margin: 0 1.5rem 1.5rem;
offset-inline-start: 0;
color: #333;
background: #d8d8d8;
text-align: center;
border: none;
border-radius: 2rem;
line-height: 4rem;
font-size: 1.6rem;
height: 4rem;
font-family: sans-serif;
font-style: italic;
}
[role="dialog"][data-type="action"] > menu > button:nth-last-child(2) {
margin-bottom: 1.5rem;
}
/* Press state */
[role="dialog"][data-type="action"] > menu button:active {
background: #00aacc;
color: #fff;
}
/* Disabled */
[role="dialog"][data-type="action"] > menu > button[disabled] {
background-color: rgba(87, 87, 87, 0.8);
color: rgba(255, 255, 255, 0.4);
opacity: 0.5;
pointer-events: none;
}
[role="dialog"][data-type="action"] > menu > .last-button-container button[disabled] {
background-color: #e7e7e7;
color: #a6a6a6;
opacity: 1;
}

View file

@ -0,0 +1,48 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Action menu</title>
<meta name="description" content="Presenting a list of actions related to the App content">
<link rel="stylesheet" href="../action_menu.css">
<!--
- This <style> element is only used for the example code;
- it is not required for the real use case.
-->
<style type="text/css">
html, body {
font-family: sans-serif;
margin: 0;
padding: 0;
font-size: 10px;
background-color: #fff;
}
body {
background: none;
}
</style>
</head>
<body role="application">
<p dir="ltr">
<label>
<input type="checkbox"
onchange="document.documentElement.dir = this.checked ? 'rtl' : 'ltr'">
RTL mode
</label>
</p>
<form role="dialog" data-type="action">
<header>
<button><span class="icon icon-close">close</span></button>
<menu type="toolbar">
<button>done</button>
</menu>
<h1>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</h1>
</header>
<section>
<p>Curabitur condimentum diam mollis lacus hendrerit congue. Phasellus porttitor orci elit, ac consequat est mollis ut. Ut consequat ipsum a ullamcorper aliquam.</p>
</section>
</form>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 245 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 178 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 178 B

View file

@ -0,0 +1,51 @@
<!DOCTYPE html>
<html dir="ltr">
<head>
<meta charset="utf-8">
<title>Action menu</title>
<meta name="description" content="Presenting a list of actions related to the App content">
<link rel="stylesheet" href="../action_menu.css">
<!--
- These <style> and <script> elements are only used for the example code;
- they are not required for the real use case.
-->
<style type="text/css">
html, body {
font-family: sans-serif;
margin: 0;
padding: 0;
font-size: 10px;
background-color: #fff;
}
body {
background: none;
}
</style>
<script>
window.onkeypress = event => {
var dir = document.documentElement.dir;
document.documentElement.dir = (dir === 'ltr') ? 'rtl' : 'ltr';
};
</script>
</head>
<body role="application">
<form role="dialog" data-type="action">
<header><span class="icon icon-back"></span>Title</header> <!-- this header is optional -->
<menu type="toolbar">
<button>Action 1</button>
<button disabled> Action 2 (disabled) </button>
<button> Action 3. </button>
<button> الولايات 4</button>
<button disabled> Action 5 (disabled) </button>
<button> Action 6 </button>
<button> Action 7 </button>
<button disabled> Action 8 (disabled) </button>
<button> Action 9 </button>
<button> Cancel </button>
</menu>
</form>
</body>
</html>

View file

@ -0,0 +1,370 @@
/*
* The code is being shared between system/emergency-call/js/keypad.js
* and dialer/js/keypad.js. Be sure to update both files when you commit!
*
* BiDi note: keypads are always displayed in LTR (hardware legacy).
* This stylesheet must *NOT* be mirrored for RTL.
*/
.reset-button {
border: 0;
background: none;
}
.reset-button::-moz-focus-inner {
border: 0;
outline: none;
}
#phone-number-view-container {
width: 100%;
height: 28%;
background: var(--header-background);
text-align: center;
display: flex;
font-weight: 300;
overflow: hidden;
}
#phone-number-view-container .phone-number-view-wrapper-input {
width: 100%;
margin-bottom: 4.5rem;
display: flex;
align-items: center;
padding: 0 1rem 0 2rem;
}
#phone-number-view-container.keypad-visible {
height: calc(100% - 34.5rem);
visibility: hidden;
}
#phone-number-view {
font-size: 4.1rem;
width: 100%;
border: 0;
margin: 0;
background: transparent;
color: var(--header-color);
text-align: left;
cursor: none;
padding: 0;
pointer-events: auto;
-moz-user-select: text;
}
#fake-phone-number-view {
position: absolute;
left: 2rem;
line-height: 0;
visibility: hidden;
}
#keypad-delete {
margin-bottom: 4.5rem;
padding: 0 2.5rem 0 0;
visibility: hidden;
text-align: right;
}
#keypad-delete::before {
content: "";
background: url('keypad/images/keypad/actionicon_dialer_delete.png') no-repeat;
width: 3rem;
height: 2rem;
display: inline-block;
background-size: 100%;
}
#keypad-delete:active {
opacity: 0.6;
}
#keyboard-container {
height: 72%;
padding: 0 1rem;
}
#keypad {
width: 100%;
height: 80%;
display: table;
table-layout: fixed;
}
.keypad-row {
display: table-row;
}
.keypad-key {
display: table-cell;
padding: 1.3rem 0 0 2rem;
box-sizing: border-box;
height: 20%;
vertical-align: middle;
color: #333;
font-weight: 300;
font-size: 5rem;
line-height: 1rem;
overflow: hidden;
text-align: left;
}
.keypad-key span {
width: 1.5rem;
display: inline-block;
overflow: visible;
}
.keypad-key em {
display: inline-block;
font-weight: 300;
font-size: 1.5rem;
color: #038282;
font-style: normal;
width: 4.5rem;
overflow: visible;
text-align: left;
}
.keypad-key.active {
background: #94eee9;
color: #fff;
}
.keypad-key * {
pointer-events: none;
}
#keypad-delete * {
pointer-events: none;
}
.keypad-key .font-size-plus {
font-size: 2rem;
}
.keypad-subicon {
background-repeat: no-repeat;
background-position: center bottom;
-moz-user-select: none;
pointer-events: none;
display: inline-block;
width: 3rem;
height: 2rem;
}
.voicemail {
background-image: url('keypad/images/keypad/actionicon_dialer_voicemail.png');
background-size: 3rem;
background-position: -0.4rem -0.1rem;
}
.asterisk {
width: 4rem;
margin-top: 1rem;
margin-left: 0.2rem;
overflow: visible;
}
.sharp {
font-size: 4.5rem;
width: 4rem;
line-height: 0;
margin-top: -0.5rem;
margin-left: 0.2rem;
overflow: visible;
}
#keypad-callbar {
height: 20%;
display: flex;
flex-direction: row;
align-items: center;
width: 100%;
border-bottom: 0;
border-left: 0;
box-sizing: border-box;
}
.keypad-callbar-button {
position: relative;
width: 9rem;
background: #e7e7e7;
background-size: auto 100%;
border-radius: 2rem;
overflow: hidden;
height: 4rem;
text-align: center;
}
.keypad-callbar-button.cancel {
background: #575757;
line-height: 4rem;
font-size: 1.8rem;
font-style: italic;
}
.keypad-callbar-button.cancel:active {
background: #9ef2e7;
}
#keypad-callbar-call-action {
display: flex;
position: relative;
flex-grow: 1;
align-items: center;
flex-direction: row-reverse;
background-image: url("keypad/images/keypad/actionicon_activecall_pickup.png");
background-color: #00adad;
background-repeat: no-repeat;
background-position: center;
background-size: 4rem 4rem;
border-radius: 2rem;
margin-inline-start: 1rem;
height: 4rem;
}
#keypad-callbar-call-action:active {
background-color: #94eee9;
}
.icon-add-contact::before {
content: "";
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
background-image: url("keypad/images/keypad/actionicon_activecall_addcontact_40x80.png");
background-repeat: no-repeat;
background-position: top center;
background-size: 4rem 8rem;
}
/* we won't do anything on click but this prevents fluffing/rendering issues */
.icon-add-contact:disabled {
pointer-events: all;
}
.icon-add-contact:disabled::before {
opacity: 0.4;
}
.icon-add-contact:not(:disabled):active::before {
background-position: center -4rem;
}
.js-sim-indication {
display: none;
font-size: 1.3rem;
text-align: right;
margin-right: 0.6rem;
color: #fff;
}
.has-preferred-sim .js-sim-indication {
display: initial;
}
.has-preferred-sim #keypad-callbar-call-action:after {
content: "";
position: absolute;
width: 1.4rem;
height: 1rem;
bottom: 0;
right: 1.7rem;
background-image: url("/shared/elements/gaia_sim_picker/images/long-tap-indicator.png");
background-repeat: no-repeat;
background-size: 1.4rem 1rem;
}
#keypad-hidebar {
border: 0;
box-sizing: border-box;
display: flex;
justify-content: space-around;
height: 7.5rem;
}
.kh__button {
width: 5rem;
height: 5rem;
background: #ded9d6;
border: none;
border-radius: 100%;
margin-top: 1rem;
position: relative;
}
.kh__button::before {
content: "";
position: absolute;
top: .5rem;
left: .5rem;
width: 4rem;
height: 4rem;
background-repeat: no-repeat;
background-position: 0 0;
background-size: cover;
}
.kh__button:active::before {
background-position: 0 -4rem;
}
.kh__button:active {
background-color: #9ef2e7;
}
.kh__button.active-state::before {
background-position: 0 -8rem;
}
.kh__button--mute::before {
background-image: url('keypad/images/keypad/actionicon_activecall_mute.png');
}
.kh__button--hide::before {
background-image: url('keypad/images/keypad/actionicon_activecall_dismisskeyboard.png');
}
.kh__call-end-button {
width: 6.5rem;
height: 6.5rem;
background: #e00;
border: none;
border-radius: 100%;
position: relative;
}
.kh__call-end-button::before {
content: "";
position: absolute;
top: 1.1rem;
left: 1.2rem;
width: 4rem;
height: 4rem;
background-image: url('keypad/images/actionicon_activecall_hangup.png');
background-repeat: no-repeat;
background-position: 0 0;
background-size: cover;
}
.kh__call-end-button:active::before {
background-position: 1.2rem 6rem;
}
.phone-number-font {
color: #fff;
}
.full-height {
height: 100%;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 264 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 283 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 234 B

View file

@ -0,0 +1,59 @@
/*
* Extend action menu as an overlay
*/
form.overlay {
font-size: 1.5rem;
opacity: 1;
visibility: hidden;
transform: translateY(-100%);
transition: transform var(--transition-duration) ease-in-out,
visibility var(--transition-duration);
}
form.overlay > menu {
height: 100%;
}
form.overlay.display {
transform: translateY(0%);
visibility: visible;
}
form.overlay menu ul {
height: calc(100% - 13rem);
overflow: auto;
margin-top: 5rem;
padding: 0;
line-height: 2.4rem;
list-style: none outside none;
}
form.overlay menu ul > li,
form.overlay menu ul > section {
height: 4.5rem;
padding: 1rem 2rem;
font-size: 1.7rem;
position: relative;
}
form.overlay menu ul > li:after,
form.overlay menu ul > section:after {
content: ' ';
border-bottom: 0.1rem solid #666;
display: block;
position: absolute;
left: 1rem;
bottom: 0;
right: 1rem;
}
form.overlay menu ul > li:last-child:after,
form.overlay menu ul > section:last-child:after {
display: none;
}
form.overlay menu ul > li:active,
form.overlay menu ul > section:active {
background-color: #00ABCC;
transition: background-color 0.2s ease;
}

View file

@ -0,0 +1,31 @@
/* ----------------------------------
* Status
* ---------------------------------- */
html[dir="ltr"] section[role="status"] [dir] { text-align: left; }
html[dir="rtl"] section[role="status"] [dir] { text-align: right; }
section[role="status"] {
background-color: #4d4d4d;
overflow: hidden;
position: absolute;
z-index: 100;
left: 0;
right: 0;
bottom: 0;
color: #fff;
}
html[dir="ltr"] section[role="status"] { background-position: left top; }
html[dir="rtl"] section[role="status"] { background-position: right top; }
section[role="status"] p {
font-size: 1.8rem;
font-weight: normal;
line-height: 2.2rem;
margin: 1rem 3rem;
padding: 0;
}
section[role="status"] p strong {
font-weight: 500;
}

View file

@ -0,0 +1,48 @@
<!DOCTYPE html>
<html dir="ltr">
<head>
<meta charset="utf-8">
<title>Status</title>
<meta name="description" content="Most common used after Multi-Select edit, to confirm user action, and optional provide 'Undo' input">
<link rel="stylesheet" href="../status.css">
<!--
This <style>, <script> and <link> are only used for the example code,
they are not needed for the real use case
-->
<style>
html, body {
margin: 0;
padding: 0;
font-size: 10px;
background-color: #fff;
}
body {
background: none;
}
</style>
<script>
window.onload = function(){
document.getElementById('dir').checked = false;
};
</script>
</head>
<body role="application">
<p dir="ltr">
<label>
<input id="dir" type="checkbox"
onchange="document.documentElement.dir = this.checked ? 'rtl' : 'ltr'">
RTL mode
</label>
</p>
<section role="status">
<p>The Alarm is set for <strong>7 hours</strong> and <strong>14 minutes</strong> from now</p>
</section>
</body>
</html>