retold 4.0.1 → 4.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.local.json +38 -1
- package/README.md +92 -2
- package/docs/README.md +7 -6
- package/docs/_sidebar.md +36 -21
- package/docs/_topbar.md +2 -2
- package/docs/architecture/comprehensions.md +282 -0
- package/docs/architecture/fluid-models.md +355 -0
- package/docs/architecture/module-architecture.md +234 -0
- package/docs/{modules.md → architecture/modules.md} +25 -22
- package/docs/cover.md +2 -2
- package/docs/css/docuserve.css +6 -6
- package/docs/examples/examples.md +71 -0
- package/docs/examples/todolist/todo-list-cli-client.md +178 -0
- package/docs/examples/todolist/todo-list-console-client.md +152 -0
- package/docs/examples/todolist/todo-list-model.md +114 -0
- package/docs/examples/todolist/todo-list-server.md +128 -0
- package/docs/examples/todolist/todo-list-web-client.md +177 -0
- package/docs/examples/todolist/todo-list.md +162 -0
- package/docs/getting-started.md +8 -7
- package/docs/index.html +4 -4
- package/docs/{meadow.md → modules/meadow.md} +4 -6
- package/docs/{orator.md → modules/orator.md} +1 -0
- package/docs/{pict.md → modules/pict.md} +30 -8
- package/docs/{utility.md → modules/utility.md} +0 -9
- package/docs/retold-catalog.json +1792 -231
- package/docs/retold-keyword-index.json +136439 -64616
- package/examples/todo-list/Dockerfile +45 -0
- package/examples/todo-list/README.md +394 -0
- package/examples/todo-list/cli-client/package-lock.json +418 -0
- package/examples/todo-list/cli-client/package.json +19 -0
- package/examples/todo-list/cli-client/source/TodoCLI-CLIProgram.js +30 -0
- package/examples/todo-list/cli-client/source/TodoCLI-Run.js +3 -0
- package/examples/todo-list/cli-client/source/commands/add/TodoCLI-Command-Add.js +74 -0
- package/examples/todo-list/cli-client/source/commands/complete/TodoCLI-Command-Complete.js +84 -0
- package/examples/todo-list/cli-client/source/commands/list/TodoCLI-Command-List.js +110 -0
- package/examples/todo-list/cli-client/source/commands/remove/TodoCLI-Command-Remove.js +49 -0
- package/examples/todo-list/cli-client/source/services/TodoCLI-Service-API.js +92 -0
- package/examples/todo-list/console-client/console-client.cjs +913 -0
- package/examples/todo-list/console-client/package-lock.json +426 -0
- package/examples/todo-list/console-client/package.json +19 -0
- package/examples/todo-list/console-client/views/PictView-TUI-Header.cjs +43 -0
- package/examples/todo-list/console-client/views/PictView-TUI-Layout.cjs +58 -0
- package/examples/todo-list/console-client/views/PictView-TUI-StatusBar.cjs +41 -0
- package/examples/todo-list/console-client/views/PictView-TUI-TaskList.cjs +104 -0
- package/examples/todo-list/docker-motd.sh +36 -0
- package/examples/todo-list/docker-run.sh +2 -0
- package/examples/todo-list/docker-shell.sh +2 -0
- package/examples/todo-list/model/MeadowSchema-Task.json +152 -0
- package/examples/todo-list/model/Task-Compiled.json +25 -0
- package/examples/todo-list/model/Task.mddl +15 -0
- package/examples/todo-list/model/data/seeded_todo_events.csv +1001 -0
- package/examples/todo-list/server/database-initialization-service.cjs +273 -0
- package/examples/todo-list/server/package-lock.json +6113 -0
- package/examples/todo-list/server/package.json +19 -0
- package/examples/todo-list/server/server.cjs +138 -0
- package/examples/todo-list/web-client/css/todolist-theme.css +235 -0
- package/examples/todo-list/web-client/generate-build-config.cjs +18 -0
- package/examples/todo-list/web-client/html/index.html +18 -0
- package/examples/todo-list/web-client/package-lock.json +12030 -0
- package/examples/todo-list/web-client/package.json +43 -0
- package/examples/todo-list/web-client/source/TodoList-Application-Config.json +12 -0
- package/examples/todo-list/web-client/source/TodoList-Application.cjs +383 -0
- package/examples/todo-list/web-client/source/providers/Provider-TaskData.cjs +243 -0
- package/examples/todo-list/web-client/source/providers/Router-Config.json +32 -0
- package/examples/todo-list/web-client/source/views/View-Layout.cjs +75 -0
- package/examples/todo-list/web-client/source/views/View-TaskForm.cjs +87 -0
- package/examples/todo-list/web-client/source/views/View-TaskList.cjs +127 -0
- package/examples/todo-list/web-client/source/views/calendar/View-MonthView.cjs +293 -0
- package/examples/todo-list/web-client/source/views/calendar/View-WeekView.cjs +149 -0
- package/examples/todo-list/web-client/source/views/calendar/View-YearView.cjs +226 -0
- package/modules/Include-Retold-Module-List.sh +2 -2
- package/package.json +5 -5
- package/docs/js/pict.min.js +0 -12
- package/docs/js/pict.min.js.map +0 -1
- package/docs/pict-docuserve.min.js +0 -58
- package/docs/pict-docuserve.min.js.map +0 -1
- /package/docs/{architecture.md → architecture/architecture.md} +0 -0
- /package/docs/{fable.md → modules/fable.md} +0 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "retold-example-todo-server",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Retold Example: Todo List API Server with SQLite",
|
|
5
|
+
"main": "server.cjs",
|
|
6
|
+
"scripts":
|
|
7
|
+
{
|
|
8
|
+
"start": "node server.cjs"
|
|
9
|
+
},
|
|
10
|
+
"dependencies":
|
|
11
|
+
{
|
|
12
|
+
"fable": "^3.1.51",
|
|
13
|
+
"meadow": "^2.0.18",
|
|
14
|
+
"meadow-connection-sqlite": "^1.0.11",
|
|
15
|
+
"meadow-endpoints": "^4.0.7",
|
|
16
|
+
"orator": "^5.0.2",
|
|
17
|
+
"orator-serviceserver-restify": "^2.0.5"
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retold Todo List -- API Server
|
|
3
|
+
*
|
|
4
|
+
* Demonstrates Fable + Orator + Meadow + MeadowEndpoints + SQLite
|
|
5
|
+
* working together to serve a full CRUD REST API and static web files.
|
|
6
|
+
*
|
|
7
|
+
* The Task table DDL is defined in model/Task.mddl (Stricture MicroDDL),
|
|
8
|
+
* compiled to model/Task-Compiled.json, and created at startup using the
|
|
9
|
+
* meadow-connection-sqlite provider's built-in table creation.
|
|
10
|
+
*
|
|
11
|
+
* Seed data is loaded from model/data/seeded_todo_events.csv through
|
|
12
|
+
* the Meadow DAL, so GUIDs, audit stamps and defaults are applied
|
|
13
|
+
* automatically on first run.
|
|
14
|
+
*
|
|
15
|
+
* Run: node server.cjs
|
|
16
|
+
* API: http://localhost:8086/1.0/Task (CRUD endpoints)
|
|
17
|
+
* Web: http://localhost:8086/ (static files from ../web-client/dist/)
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
const libPath = require('path');
|
|
21
|
+
const libFS = require('fs');
|
|
22
|
+
|
|
23
|
+
const libFable = require('fable');
|
|
24
|
+
const libOrator = require('orator');
|
|
25
|
+
const libOratorServiceServerRestify = require('orator-serviceserver-restify');
|
|
26
|
+
const libMeadow = require('meadow');
|
|
27
|
+
const libMeadowEndpoints = require('meadow-endpoints');
|
|
28
|
+
const libMeadowConnectionSQLite = require('meadow-connection-sqlite');
|
|
29
|
+
|
|
30
|
+
const libDatabaseInitializationService = require('./database-initialization-service.cjs');
|
|
31
|
+
|
|
32
|
+
const _TaskSchema = require('../model/MeadowSchema-Task.json');
|
|
33
|
+
const _CompiledModel = require('../model/Task-Compiled.json');
|
|
34
|
+
|
|
35
|
+
let tmpDataDir = libPath.resolve(__dirname, 'data');
|
|
36
|
+
let tmpSeedCSV = libPath.resolve(__dirname, '..', 'model', 'data', 'seeded_todo_events.csv');
|
|
37
|
+
|
|
38
|
+
let _Settings =
|
|
39
|
+
{
|
|
40
|
+
Product: 'TodoList-Server',
|
|
41
|
+
ProductVersion: '1.0.0',
|
|
42
|
+
APIServerPort: 8086,
|
|
43
|
+
SQLite:
|
|
44
|
+
{
|
|
45
|
+
SQLiteFilePath: libPath.resolve(tmpDataDir, 'todo.sqlite')
|
|
46
|
+
},
|
|
47
|
+
MeadowEndpointsSessionDataSource: 'None'
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
let _Fable = new libFable(_Settings);
|
|
51
|
+
|
|
52
|
+
// Register service types
|
|
53
|
+
_Fable.serviceManager.addServiceType('OratorServiceServer', libOratorServiceServerRestify);
|
|
54
|
+
_Fable.serviceManager.addServiceType('MeadowSQLiteProvider', libMeadowConnectionSQLite);
|
|
55
|
+
_Fable.serviceManager.addServiceType('DatabaseInitializationService', libDatabaseInitializationService);
|
|
56
|
+
|
|
57
|
+
// Instantiate the SQLite provider and our database initialization service
|
|
58
|
+
_Fable.serviceManager.instantiateServiceProvider('MeadowSQLiteProvider');
|
|
59
|
+
let _DatabaseService = _Fable.serviceManager.instantiateServiceProvider('DatabaseInitializationService', { DataDirectory: tmpDataDir });
|
|
60
|
+
|
|
61
|
+
_DatabaseService.connectDatabase(
|
|
62
|
+
(pError) =>
|
|
63
|
+
{
|
|
64
|
+
if (pError)
|
|
65
|
+
{
|
|
66
|
+
return process.exit(1);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Create tables from the compiled Stricture DDL using the provider's built-in table creation
|
|
70
|
+
_DatabaseService.createTablesFromModel(_CompiledModel,
|
|
71
|
+
(pCreateError) =>
|
|
72
|
+
{
|
|
73
|
+
if (pCreateError)
|
|
74
|
+
{
|
|
75
|
+
_Fable.log.error('Table creation error: ' + pCreateError.message);
|
|
76
|
+
return process.exit(1);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Create the Meadow DAL for the Task entity
|
|
80
|
+
let _TaskDAL = libMeadow.new(_Fable, 'Task')
|
|
81
|
+
.setProvider('SQLite')
|
|
82
|
+
.setSchema(_TaskSchema.Schema)
|
|
83
|
+
.setJsonSchema(_TaskSchema.JsonSchema)
|
|
84
|
+
.setDefaultIdentifier(_TaskSchema.DefaultIdentifier)
|
|
85
|
+
.setDefault(_TaskSchema.DefaultObject);
|
|
86
|
+
|
|
87
|
+
// Seed from CSV through the Meadow DAL (skips if table already has data)
|
|
88
|
+
_DatabaseService.seedFromCSV(_TaskDAL, tmpSeedCSV,
|
|
89
|
+
(pSeedError) =>
|
|
90
|
+
{
|
|
91
|
+
if (pSeedError)
|
|
92
|
+
{
|
|
93
|
+
_Fable.log.error('Seed error: ' + pSeedError.message);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
_startServer(_TaskDAL);
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
function _startServer(pTaskDAL)
|
|
102
|
+
{
|
|
103
|
+
// Create meadow endpoints (auto-generates REST routes)
|
|
104
|
+
let _TaskEndpoints = libMeadowEndpoints.new(pTaskDAL);
|
|
105
|
+
|
|
106
|
+
// Initialize Orator and wire up routes
|
|
107
|
+
let _Orator = new libOrator(_Fable, {});
|
|
108
|
+
_Orator.initialize(
|
|
109
|
+
() =>
|
|
110
|
+
{
|
|
111
|
+
// Connect the auto-generated CRUD endpoints
|
|
112
|
+
_TaskEndpoints.connectRoutes(_Orator.serviceServer);
|
|
113
|
+
|
|
114
|
+
// Serve static files from the web client dist folder
|
|
115
|
+
let tmpDistPath = libPath.resolve(__dirname, '..', 'web-client', 'dist');
|
|
116
|
+
if (libFS.existsSync(tmpDistPath))
|
|
117
|
+
{
|
|
118
|
+
_Orator.addStaticRoute(tmpDistPath + '/', 'index.html');
|
|
119
|
+
}
|
|
120
|
+
else
|
|
121
|
+
{
|
|
122
|
+
_Fable.log.warn('Web client dist/ not found. Build it with: cd ../web-client && npm run build');
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// Start the server
|
|
126
|
+
_Orator.startService(
|
|
127
|
+
(pStartError) =>
|
|
128
|
+
{
|
|
129
|
+
if (pStartError)
|
|
130
|
+
{
|
|
131
|
+
_Fable.log.error('Server start error: ' + pStartError.message);
|
|
132
|
+
return process.exit(1);
|
|
133
|
+
}
|
|
134
|
+
_Fable.log.info('Todo List server running on http://localhost:' + _Settings.APIServerPort);
|
|
135
|
+
_Fable.log.info('API endpoints at /1.0/Task (CRUD)');
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Todo List — Sagebrush Theme
|
|
3
|
+
*
|
|
4
|
+
* Common base styles shared across all views.
|
|
5
|
+
* Loaded via <link> in index.html so views only need
|
|
6
|
+
* view-specific CSS in their configuration objects.
|
|
7
|
+
*
|
|
8
|
+
* Palette:
|
|
9
|
+
* Dark brown #3D3229 (headers, labels)
|
|
10
|
+
* Warm cream #E8E0D4 (header text)
|
|
11
|
+
* Body bg #F5F0E8 (light cream)
|
|
12
|
+
* Body text #423D37 (dark warm brown)
|
|
13
|
+
* Teal #2E7D74 (primary, success, focus)
|
|
14
|
+
* Rust #9E6B47 (danger, open/pending)
|
|
15
|
+
* Warm gray #8A7F72 (default, muted)
|
|
16
|
+
* Taupe border #DDD6CA (borders, dividers)
|
|
17
|
+
* Hover bg #EAE3D8 (pale tan)
|
|
18
|
+
* Today bg #E0EDEB (light teal)
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
/* ── Reset & Base ─────────────────────────────────────── */
|
|
22
|
+
|
|
23
|
+
* { box-sizing: border-box; }
|
|
24
|
+
|
|
25
|
+
body {
|
|
26
|
+
margin: 0;
|
|
27
|
+
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
|
|
28
|
+
background: #F5F0E8;
|
|
29
|
+
color: #423D37;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
#TodoList-Content {
|
|
33
|
+
max-width: 900px;
|
|
34
|
+
margin: 2em auto;
|
|
35
|
+
padding: 0 1em;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/* ── Typography ───────────────────────────────────────── */
|
|
39
|
+
|
|
40
|
+
.tl-heading {
|
|
41
|
+
margin: 0 0 1em 0;
|
|
42
|
+
font-size: 1.5em;
|
|
43
|
+
font-weight: 600;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.tl-empty {
|
|
47
|
+
text-align: center;
|
|
48
|
+
padding: 3em 1em;
|
|
49
|
+
color: #8A7F72;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/* ── Buttons ──────────────────────────────────────────── */
|
|
53
|
+
|
|
54
|
+
.tl-btn {
|
|
55
|
+
display: inline-block;
|
|
56
|
+
padding: 0.45em 1em;
|
|
57
|
+
border: none;
|
|
58
|
+
border-radius: 4px;
|
|
59
|
+
cursor: pointer;
|
|
60
|
+
font-size: 0.9em;
|
|
61
|
+
font-family: inherit;
|
|
62
|
+
transition: opacity 0.15s;
|
|
63
|
+
}
|
|
64
|
+
.tl-btn:hover { opacity: 0.85; }
|
|
65
|
+
.tl-btn-primary { background: #2E7D74; color: #fff; }
|
|
66
|
+
.tl-btn-danger { background: #9E6B47; color: #fff; }
|
|
67
|
+
.tl-btn-success { background: #2E7D74; color: #fff; }
|
|
68
|
+
.tl-btn-default { background: #8A7F72; color: #fff; }
|
|
69
|
+
|
|
70
|
+
/* ── Data Table ───────────────────────────────────────── */
|
|
71
|
+
|
|
72
|
+
.tl-table {
|
|
73
|
+
width: 100%;
|
|
74
|
+
border-collapse: collapse;
|
|
75
|
+
background: #fff;
|
|
76
|
+
border-radius: 6px;
|
|
77
|
+
overflow: hidden;
|
|
78
|
+
box-shadow: 0 1px 3px rgba(0,0,0,0.08);
|
|
79
|
+
}
|
|
80
|
+
.tl-table th {
|
|
81
|
+
background: #3D3229;
|
|
82
|
+
color: #E8E0D4;
|
|
83
|
+
text-align: left;
|
|
84
|
+
padding: 0.75em 1em;
|
|
85
|
+
font-weight: 600;
|
|
86
|
+
font-size: 0.9em;
|
|
87
|
+
}
|
|
88
|
+
.tl-table td {
|
|
89
|
+
padding: 0.65em 1em;
|
|
90
|
+
border-bottom: 1px solid #DDD6CA;
|
|
91
|
+
font-size: 0.95em;
|
|
92
|
+
}
|
|
93
|
+
.tl-table tr:last-child td { border-bottom: none; }
|
|
94
|
+
.tl-table tr:hover td { background: #EAE3D8; }
|
|
95
|
+
|
|
96
|
+
/* ── Status Badges ────────────────────────────────────── */
|
|
97
|
+
|
|
98
|
+
.tl-status {
|
|
99
|
+
display: inline-block;
|
|
100
|
+
padding: 0.2em 0.6em;
|
|
101
|
+
border-radius: 12px;
|
|
102
|
+
font-size: 0.8em;
|
|
103
|
+
font-weight: 600;
|
|
104
|
+
}
|
|
105
|
+
.tl-status-pending { background: #F0ECE4; color: #9E6B47; }
|
|
106
|
+
.tl-status-inprogress { background: #D6EAE7; color: #2E7D74; }
|
|
107
|
+
.tl-status-complete { background: #E0EDEB; color: #2E7D74; }
|
|
108
|
+
|
|
109
|
+
/* ── Toolbar (Search / Sort / Record Count) ───────────── */
|
|
110
|
+
|
|
111
|
+
.tl-toolbar {
|
|
112
|
+
display: flex;
|
|
113
|
+
align-items: center;
|
|
114
|
+
justify-content: space-between;
|
|
115
|
+
margin-bottom: 1em;
|
|
116
|
+
padding: 0.75em 1em;
|
|
117
|
+
background: #fff;
|
|
118
|
+
border-radius: 6px;
|
|
119
|
+
box-shadow: 0 1px 3px rgba(0,0,0,0.08);
|
|
120
|
+
}
|
|
121
|
+
.tl-toolbar-group { display: flex; align-items: center; gap: 0.5em; }
|
|
122
|
+
.tl-toolbar-label { font-size: 0.85em; font-weight: 600; color: #8A7F72; }
|
|
123
|
+
.tl-toolbar select {
|
|
124
|
+
padding: 0.35em 0.6em;
|
|
125
|
+
border: 1px solid #DDD6CA;
|
|
126
|
+
border-radius: 4px;
|
|
127
|
+
font-size: 0.85em;
|
|
128
|
+
font-family: inherit;
|
|
129
|
+
background: #fff;
|
|
130
|
+
cursor: pointer;
|
|
131
|
+
}
|
|
132
|
+
.tl-toolbar select:focus { outline: none; border-color: #2E7D74; }
|
|
133
|
+
.tl-toolbar input[type="text"] {
|
|
134
|
+
padding: 0.35em 0.6em;
|
|
135
|
+
border: 1px solid #DDD6CA;
|
|
136
|
+
border-radius: 4px;
|
|
137
|
+
font-size: 0.85em;
|
|
138
|
+
font-family: inherit;
|
|
139
|
+
width: 14em;
|
|
140
|
+
}
|
|
141
|
+
.tl-toolbar input[type="text"]:focus { outline: none; border-color: #2E7D74; }
|
|
142
|
+
.tl-record-count { font-size: 0.85em; color: #8A7F72; }
|
|
143
|
+
|
|
144
|
+
/* ── Forms ────────────────────────────────────────────── */
|
|
145
|
+
|
|
146
|
+
.tl-form {
|
|
147
|
+
background: #fff;
|
|
148
|
+
padding: 1.5em;
|
|
149
|
+
border-radius: 6px;
|
|
150
|
+
box-shadow: 0 1px 3px rgba(0,0,0,0.08);
|
|
151
|
+
}
|
|
152
|
+
.tl-form-group { margin-bottom: 1.25em; }
|
|
153
|
+
.tl-form-group label {
|
|
154
|
+
display: block;
|
|
155
|
+
font-weight: 600;
|
|
156
|
+
margin-bottom: 0.35em;
|
|
157
|
+
font-size: 0.9em;
|
|
158
|
+
color: #3D3229;
|
|
159
|
+
}
|
|
160
|
+
.tl-form-group input,
|
|
161
|
+
.tl-form-group textarea,
|
|
162
|
+
.tl-form-group select {
|
|
163
|
+
width: 100%;
|
|
164
|
+
padding: 0.5em 0.75em;
|
|
165
|
+
border: 1px solid #DDD6CA;
|
|
166
|
+
border-radius: 4px;
|
|
167
|
+
font-size: 0.95em;
|
|
168
|
+
font-family: inherit;
|
|
169
|
+
}
|
|
170
|
+
.tl-form-group textarea { resize: vertical; }
|
|
171
|
+
.tl-form-group input:focus,
|
|
172
|
+
.tl-form-group textarea:focus,
|
|
173
|
+
.tl-form-group select:focus {
|
|
174
|
+
outline: none;
|
|
175
|
+
border-color: #2E7D74;
|
|
176
|
+
box-shadow: 0 0 0 2px rgba(46,125,116,0.15);
|
|
177
|
+
}
|
|
178
|
+
.tl-form-actions { display: flex; gap: 0.75em; margin-top: 1.5em; }
|
|
179
|
+
|
|
180
|
+
/* ── Calendar Shared ──────────────────────────────────── */
|
|
181
|
+
|
|
182
|
+
.tl-cal-header {
|
|
183
|
+
display: flex;
|
|
184
|
+
align-items: center;
|
|
185
|
+
justify-content: space-between;
|
|
186
|
+
margin-bottom: 1em;
|
|
187
|
+
}
|
|
188
|
+
.tl-cal-header h2 { margin: 0; font-size: 1.5em; font-weight: 600; }
|
|
189
|
+
.tl-cal-nav { display: flex; align-items: center; gap: 0.5em; }
|
|
190
|
+
.tl-cal-nav .tl-btn { font-size: 0.85em; padding: 0.35em 0.75em; }
|
|
191
|
+
.tl-cal-label {
|
|
192
|
+
font-size: 1.1em;
|
|
193
|
+
font-weight: 600;
|
|
194
|
+
min-width: 14em;
|
|
195
|
+
text-align: center;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
.tl-cal-table {
|
|
199
|
+
width: 100%;
|
|
200
|
+
border-collapse: collapse;
|
|
201
|
+
background: #fff;
|
|
202
|
+
border-radius: 6px;
|
|
203
|
+
overflow: hidden;
|
|
204
|
+
box-shadow: 0 1px 3px rgba(0,0,0,0.08);
|
|
205
|
+
}
|
|
206
|
+
.tl-cal-table th {
|
|
207
|
+
background: #3D3229;
|
|
208
|
+
color: #E8E0D4;
|
|
209
|
+
text-align: left;
|
|
210
|
+
padding: 0.75em 1em;
|
|
211
|
+
font-weight: 600;
|
|
212
|
+
font-size: 0.9em;
|
|
213
|
+
}
|
|
214
|
+
.tl-cal-table td {
|
|
215
|
+
padding: 0.65em 1em;
|
|
216
|
+
border-bottom: 1px solid #DDD6CA;
|
|
217
|
+
font-size: 0.95em;
|
|
218
|
+
}
|
|
219
|
+
.tl-cal-table tr:last-child td { border-bottom: none; }
|
|
220
|
+
.tl-cal-table tr:hover td { background: #EAE3D8; }
|
|
221
|
+
.tl-cal-today td { background: #E0EDEB; }
|
|
222
|
+
|
|
223
|
+
.tl-cal-badge {
|
|
224
|
+
display: inline-block;
|
|
225
|
+
min-width: 1.6em;
|
|
226
|
+
text-align: center;
|
|
227
|
+
padding: 0.15em 0.45em;
|
|
228
|
+
border-radius: 12px;
|
|
229
|
+
font-size: 0.85em;
|
|
230
|
+
font-weight: 600;
|
|
231
|
+
}
|
|
232
|
+
.tl-cal-badge-complete { background: #E0EDEB; color: #2E7D74; }
|
|
233
|
+
.tl-cal-badge-open { background: #F0ECE4; color: #9E6B47; }
|
|
234
|
+
.tl-cal-badge-zero { background: #EAE3D8; color: #8A7F72; }
|
|
235
|
+
.tl-cal-total { font-weight: 600; background: #EAE3D8; }
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// Generates .gulpfile-quackage-config.json with absolute paths for the current environment
|
|
2
|
+
const libPath = require('path');
|
|
3
|
+
const libFS = require('fs');
|
|
4
|
+
|
|
5
|
+
const tmpConfig =
|
|
6
|
+
{
|
|
7
|
+
EntrypointInputSourceFile: libPath.resolve(__dirname, 'source/TodoList-Application.cjs'),
|
|
8
|
+
LibraryObjectName: 'TodoListApp',
|
|
9
|
+
LibraryOutputFolder: libPath.resolve(__dirname, 'dist') + '/',
|
|
10
|
+
LibraryUniminifiedFileName: 'todo-list-app.compatible.js',
|
|
11
|
+
LibraryMinifiedFileName: 'todo-list-app.compatible.min.js'
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
libFS.writeFileSync(
|
|
15
|
+
libPath.resolve(__dirname, '.gulpfile-quackage-config.json'),
|
|
16
|
+
JSON.stringify(tmpConfig, null, '\t'));
|
|
17
|
+
|
|
18
|
+
console.log('Build config generated.');
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
|
+
<title>Retold Todo List</title>
|
|
7
|
+
<link rel="stylesheet" href="./css/todolist-theme.css">
|
|
8
|
+
<style id="PICT-CSS"></style>
|
|
9
|
+
<script src="./js/pict.min.js" type="text/javascript"></script>
|
|
10
|
+
<script type="text/javascript">
|
|
11
|
+
Pict.safeOnDocumentReady(function() { Pict.safeLoadPictApplication(RetoldExampleTodoWebClient, 2); });
|
|
12
|
+
</script>
|
|
13
|
+
</head>
|
|
14
|
+
<body>
|
|
15
|
+
<div id="TodoList-Container"></div>
|
|
16
|
+
<script src="./retold-example-todo-web-client.compatible.min.js" type="text/javascript"></script>
|
|
17
|
+
</body>
|
|
18
|
+
</html>
|