bike 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (151) hide show
  1. data/LICENSE +19 -0
  2. data/README.rdoc +124 -0
  3. data/bin/bike +35 -0
  4. data/lib/_error.rb +14 -0
  5. data/lib/_field.rb +260 -0
  6. data/lib/_i18n.rb +144 -0
  7. data/lib/_parser.rb +256 -0
  8. data/lib/_path.rb +86 -0
  9. data/lib/_storage/_storage.rb +215 -0
  10. data/lib/_storage/file.rb +201 -0
  11. data/lib/_storage/sequel.rb +174 -0
  12. data/lib/_storage/temp.rb +73 -0
  13. data/lib/_widget/action_create.rb +23 -0
  14. data/lib/_widget/action_login.rb +22 -0
  15. data/lib/_widget/action_signup.rb +16 -0
  16. data/lib/_widget/action_update.rb +16 -0
  17. data/lib/_widget/crumb.rb +24 -0
  18. data/lib/_widget/done.rb +16 -0
  19. data/lib/_widget/login.rb +25 -0
  20. data/lib/_widget/me.rb +31 -0
  21. data/lib/_widget/message.rb +51 -0
  22. data/lib/_widget/navi.rb +88 -0
  23. data/lib/_widget/submit.rb +49 -0
  24. data/lib/_widget/view_ym.rb +77 -0
  25. data/lib/_workflow/_workflow.rb +89 -0
  26. data/lib/_workflow/attachment.rb +50 -0
  27. data/lib/_workflow/blog.rb +28 -0
  28. data/lib/_workflow/contact.rb +23 -0
  29. data/lib/_workflow/forum.rb +26 -0
  30. data/lib/_workflow/register.rb +39 -0
  31. data/lib/bike.rb +396 -0
  32. data/lib/meta/_meta.rb +20 -0
  33. data/lib/meta/group.rb +19 -0
  34. data/lib/meta/id.rb +59 -0
  35. data/lib/meta/owner.rb +21 -0
  36. data/lib/meta/timestamp.rb +118 -0
  37. data/lib/scalar/checkbox.rb +68 -0
  38. data/lib/scalar/file.rb +144 -0
  39. data/lib/scalar/img.rb +112 -0
  40. data/lib/scalar/password.rb +58 -0
  41. data/lib/scalar/radio.rb +47 -0
  42. data/lib/scalar/select.rb +47 -0
  43. data/lib/scalar/text.rb +38 -0
  44. data/lib/scalar/textarea.rb +35 -0
  45. data/lib/scalar/textarea_pre.rb +14 -0
  46. data/lib/scalar/textarea_wiki.rb +173 -0
  47. data/lib/set/_set.rb +196 -0
  48. data/lib/set/dynamic.rb +177 -0
  49. data/lib/set/static.rb +102 -0
  50. data/lib/set/static_folder.rb +96 -0
  51. data/locale/en/index.po +242 -0
  52. data/locale/index.pot +243 -0
  53. data/locale/ja/index.po +242 -0
  54. data/locale/lazy_parser.rb +54 -0
  55. data/skel/config.ru +27 -0
  56. data/skel/skin/_users/00000000_frank-avatar.jpg +0 -0
  57. data/skel/skin/_users/00000000_frank-avatar_small.jpg +0 -0
  58. data/skel/skin/_users/00000000_frank.yaml +12 -0
  59. data/skel/skin/_users/00000000_root-avatar.jpg +0 -0
  60. data/skel/skin/_users/00000000_root-avatar_small.jpg +0 -0
  61. data/skel/skin/_users/00000000_root.yaml +11 -0
  62. data/skel/skin/_users/css/users.css +21 -0
  63. data/skel/skin/_users/css/users.less +25 -0
  64. data/skel/skin/_users/done.html +42 -0
  65. data/skel/skin/_users/index.html +46 -0
  66. data/skel/skin/_users/index.yaml +3 -0
  67. data/skel/skin/_users/summary.html +40 -0
  68. data/skel/skin/css/base.css +93 -0
  69. data/skel/skin/css/base.less +139 -0
  70. data/skel/skin/css/coax.css +199 -0
  71. data/skel/skin/css/coax.less +244 -0
  72. data/skel/skin/examples/blog/20091214_0001.yaml +8 -0
  73. data/skel/skin/examples/blog/20100630_0001.yaml +8 -0
  74. data/skel/skin/examples/blog/20100630_0002.yaml +14 -0
  75. data/skel/skin/examples/blog/20100701_0001.yaml +8 -0
  76. data/skel/skin/examples/blog/20100701_0002-a-20100701_0001-f.jpg +0 -0
  77. data/skel/skin/examples/blog/20100701_0002-a-20100701_0001-f_small.jpg +0 -0
  78. data/skel/skin/examples/blog/20100701_0002.yaml +19 -0
  79. data/skel/skin/examples/blog/frank/20100701_0001.yaml +10 -0
  80. data/skel/skin/examples/blog/frank/index.yaml +4 -0
  81. data/skel/skin/examples/blog/index.html +51 -0
  82. data/skel/skin/examples/blog/rss.xml +18 -0
  83. data/skel/skin/examples/contact/20100701_0001-file.txt +1 -0
  84. data/skel/skin/examples/contact/20100701_0001.yaml +15 -0
  85. data/skel/skin/examples/contact/20100701_0002.yaml +8 -0
  86. data/skel/skin/examples/contact/20100701_0003.yaml +9 -0
  87. data/skel/skin/examples/contact/index.html +47 -0
  88. data/skel/skin/examples/contact/js/contact.js +13 -0
  89. data/skel/skin/examples/contact/summary.html +54 -0
  90. data/skel/skin/examples/forum/20100701_0001.yaml +41 -0
  91. data/skel/skin/examples/forum/20100701_0002.yaml +25 -0
  92. data/skel/skin/examples/forum/index.html +68 -0
  93. data/skel/skin/examples/forum/summary.html +47 -0
  94. data/skel/skin/examples/index.html +73 -0
  95. data/skel/skin/index.html +39 -0
  96. data/skel/skin/js/base.js +50 -0
  97. data/t/locale/de/index.po +19 -0
  98. data/t/locale/en-GB/index.po +25 -0
  99. data/t/locale/ja/index.po +30 -0
  100. data/t/skin/_users/00000000_test.yaml +3 -0
  101. data/t/skin/_users/index.html +13 -0
  102. data/t/skin/foo/20091120_0001.yaml +7 -0
  103. data/t/skin/foo/bar/20091120_0001.yaml +5 -0
  104. data/t/skin/foo/bar/index.yaml +5 -0
  105. data/t/skin/foo/baz/css/baz.css +1 -0
  106. data/t/skin/foo/css/foo.css +1 -0
  107. data/t/skin/foo/index.html +14 -0
  108. data/t/skin/foo/index.yaml +7 -0
  109. data/t/skin/foo/not_css/foo.css +1 -0
  110. data/t/skin/foo/qux/index.html +8 -0
  111. data/t/skin/foo/qux/moo/index.html +6 -0
  112. data/t/skin/foo/sub-20100306_0001.yaml +3 -0
  113. data/t/skin/index.yaml +3 -0
  114. data/t/skin/t_attachment/index.html +13 -0
  115. data/t/skin/t_contact/done.html +6 -0
  116. data/t/skin/t_contact/index.html +9 -0
  117. data/t/skin/t_file/index.html +16 -0
  118. data/t/skin/t_img/index.html +14 -0
  119. data/t/skin/t_img/test.jpg +0 -0
  120. data/t/skin/t_select/index.html +9 -0
  121. data/t/skin/t_store/index.html +9 -0
  122. data/t/skin/t_summary/20100326_0001.yaml +3 -0
  123. data/t/skin/t_summary/create.html +9 -0
  124. data/t/skin/t_summary/index.html +9 -0
  125. data/t/skin/t_summary/summary.html +9 -0
  126. data/t/t.rb +27 -0
  127. data/t/test_bike.rb +768 -0
  128. data/t/test_call.rb +1281 -0
  129. data/t/test_checkbox.rb +273 -0
  130. data/t/test_field.rb +330 -0
  131. data/t/test_file.rb +900 -0
  132. data/t/test_i18n.rb +325 -0
  133. data/t/test_id.rb +215 -0
  134. data/t/test_img.rb +328 -0
  135. data/t/test_meta.rb +57 -0
  136. data/t/test_parser.rb +1516 -0
  137. data/t/test_password.rb +188 -0
  138. data/t/test_radio.rb +226 -0
  139. data/t/test_role.rb +249 -0
  140. data/t/test_select.rb +182 -0
  141. data/t/test_set_complex.rb +527 -0
  142. data/t/test_set_dynamic.rb +1504 -0
  143. data/t/test_set_folder.rb +515 -0
  144. data/t/test_set_permit.rb +246 -0
  145. data/t/test_set_static.rb +468 -0
  146. data/t/test_storage.rb +915 -0
  147. data/t/test_text.rb +125 -0
  148. data/t/test_textarea.rb +138 -0
  149. data/t/test_timestamp.rb +473 -0
  150. data/t/test_workflow.rb +367 -0
  151. metadata +347 -0
@@ -0,0 +1,244 @@
1
+ @header-color: white;
2
+ @header-bg: #000000;
3
+ @container-bg: white;
4
+ @background: #666699;
5
+
6
+ @width: 950px;
7
+ @right: 240px;
8
+ @border: 3px;
9
+ @left: @width - @right - @border - 60;
10
+
11
+ body, html {
12
+ margin: 0;
13
+ padding: 0;
14
+ background: @background;
15
+ font-family: sans-serif;
16
+ a {
17
+ text-decoration: none;
18
+ }
19
+ }
20
+
21
+ #container {
22
+ width: @width;
23
+ margin: 0 auto;
24
+ background: @container-bg;
25
+ }
26
+
27
+ #header {
28
+ background: @header-bg;
29
+ border-bottom: @border solid @background;
30
+ padding-top: 1em;
31
+ padding-left: 20px;
32
+ h1 {
33
+ font-size: 40pt;
34
+ color: @header-color;
35
+ padding: .3em 0 0 0;
36
+ margin:0;
37
+ > a {
38
+ color: @header-color;
39
+ }
40
+ }
41
+ div.crumb {
42
+ color: red;
43
+ margin: .2em 0 .5em .4em;
44
+ > a {
45
+ color: @header-color;
46
+ }
47
+ }
48
+ }
49
+
50
+ #center {
51
+ float: left;
52
+ width: @left;
53
+ padding: 20px;
54
+ background: @container-bg;
55
+ border-right: @border solid @background;
56
+ }
57
+
58
+ #right {
59
+ float: right;
60
+ width: @right;
61
+ padding: 10px;
62
+ background: @container-bg;
63
+
64
+ margin-left: -1 * @border;
65
+ border-left: @border solid @background;
66
+ }
67
+
68
+ #footer {
69
+ clear: both;
70
+ border-top: @border solid @background;
71
+ padding-bottom: 3em;
72
+ padding-left: 2em;
73
+ background: @header-bg;
74
+ }
75
+ * html #footer {
76
+ height: 1px;
77
+ }
78
+
79
+ .column {
80
+ position: relative;
81
+ float: left;
82
+ ul {
83
+ list-style-type: none;
84
+ margin: 1em 0 0em 1em;
85
+ }
86
+ }
87
+
88
+ #center {
89
+ h2 {
90
+ padding: 0;
91
+ margin: 0;
92
+ color: red;
93
+ }
94
+
95
+ > p {
96
+ margin: 1em 0 1em 0;
97
+ }
98
+
99
+ pre {
100
+ margin: 0;
101
+ }
102
+
103
+ ul {
104
+ margin: 0 0 1em 0;
105
+ padding: 0;
106
+ }
107
+
108
+ li {
109
+ div.label {
110
+ margin: 0;
111
+ padding: .5em 10px .5em 10px;
112
+ width: 50%;
113
+ -moz-border-radius-topleft: .5em;
114
+ -moz-border-radius-topright: .5em;
115
+ -webkit-border-top-left-radius: .5em;
116
+ -webkit-border-top-right-radius: .5em;
117
+ background: black;
118
+ color: white;
119
+ a {
120
+ color: white;
121
+ font-weight: bold;
122
+ }
123
+ input {
124
+ margin: 0;
125
+ padding: 1px .2em;
126
+ border: none;
127
+ -moz-border-radius: .2em;
128
+ -webkit-border-radius: .2em;
129
+ }
130
+ }
131
+
132
+ div.ibody {
133
+ margin: 0 0 1em 0;
134
+ padding: .5em 1em .5em .5em;
135
+ border: solid black 2px;
136
+ -moz-border-radius-topright: .5em;
137
+ -moz-border-radius-bottomleft: .5em;
138
+ -moz-border-radius-bottomright: .5em;
139
+ -webkit-border-top-right-radius: .5em;
140
+ -webkit-border-bottom-left-radius: .5em;
141
+ -webkit-border-bottom-right-radius: .5em;
142
+ textarea {
143
+ width: 100%;
144
+ -moz-border-radius: .3em;
145
+ -webkit-border-radius: .3em;
146
+ }
147
+ ul {
148
+ list-style-type: disc;
149
+ margin-left: 1.5em;
150
+ }
151
+ }
152
+ }
153
+
154
+ dl {
155
+ width: 80%;
156
+ margin: 0 0 1em 1em;
157
+ padding: 0;
158
+ dt {
159
+ font-size: large;
160
+ font-weight: bold;
161
+ }
162
+ dd {
163
+ margin: .5em 0 1em 1em;
164
+ }
165
+ }
166
+
167
+ th {
168
+ width: 20%;
169
+ text-align: right;
170
+ vertical-align: top;
171
+ padding: 1em 1em 1.5em 1em;
172
+ }
173
+
174
+ td {
175
+ text-align: left;
176
+ vertical-align: top;
177
+ padding: 1em 1em 1.5em 0em;
178
+ img {
179
+ vertical-align: top;
180
+ }
181
+ }
182
+
183
+ table.summary {
184
+ width: 100%;
185
+ margin: 0;
186
+ th {
187
+ width: auto;
188
+ text-align: left;
189
+ vertical-align: top;
190
+ padding: .5em 2.5em .5em .5em;
191
+ margin: 0;
192
+ background: @header-bg;
193
+ color: white;
194
+ }
195
+ td {
196
+ width: auto;
197
+ text-align: left;
198
+ vertical-align: top;
199
+ padding: .5em 2.5em .5em .5em;
200
+ }
201
+ }
202
+
203
+ table.forum {
204
+ width: 100%;
205
+ padding: 0;
206
+ margin: 0 0 1em 0;
207
+ th {
208
+ width: 80px;
209
+ text-align: left;
210
+ vertical-align: top;
211
+ padding: .5em 2.5em .5em .5em;
212
+ margin: 0;
213
+ border: solid @header-bg 2px;
214
+ background: @header-bg;
215
+ color: white;
216
+ -moz-border-radius-topleft: .5em;
217
+ -moz-border-radius-bottomleft: .5em;
218
+ -webkit-border-top-left-radius: .5em;
219
+ -webkit-border-bottom-left-radius: .5em;
220
+ }
221
+ td {
222
+ width: auto;
223
+ text-align: left;
224
+ vertical-align: top;
225
+ padding: .5em 2.5em .5em .5em;
226
+ border: solid @header-bg 2px;
227
+ -moz-border-radius-topright: .5em;
228
+ -moz-border-radius-bottomright: .5em;
229
+ -webkit-border-top-right-radius: .5em;
230
+ -webkit-border-bottom-right-radius: .5em;
231
+ div.subject {
232
+ font-size: x-large;
233
+ font-weight: bold;
234
+ margin-bottom: 0.5px;
235
+ }
236
+ p.wiki {
237
+ margin-top: 0;
238
+ }
239
+ textarea {
240
+ width: 100%;
241
+ }
242
+ }
243
+ }
244
+ }
@@ -0,0 +1,8 @@
1
+ ---
2
+ _owner: root
3
+ _timestamp:
4
+ created: 2009-12-14 12:01:47.640862 +09:00
5
+ published: 2009-12-14 12:01:47.640862 +09:00
6
+ updated: 2009-12-14 12:01:47.640862 +09:00
7
+ body: "Maecenas justo tellus, euismod et tristique vel, dignissim aliquam urna. Duis arcu sem, adipiscing et pretium accumsan, rutrum vitae sem. Maecenas tristique volutpat justo vitae aliquet. Nulla malesuada erat iaculis purus tincidunt commodo. Nulla iaculis arcu vitae lacus cursus laoreet. Quisque pretium leo a velit scelerisque tristique. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae;"
8
+ title: "Maecenas justo tellus"
@@ -0,0 +1,8 @@
1
+ ---
2
+ _owner: root
3
+ _timestamp:
4
+ created: 2010-06-30 09:42:39.020681 +09:00
5
+ published: 2010-06-30 09:42:39.020681 +09:00
6
+ updated: 2010-06-30 09:42:39.020681 +09:00
7
+ body: "Proin turpis urna, congue non rutrum non, tincidunt ut felis. Donec pharetra viverra sem, in cursus metus aliquet in. Etiam commodo aliquam sem, nec faucibus mi suscipit porttitor. Vestibulum lobortis tortor eu magna malesuada pulvinar. In et magna hendrerit dui semper vehicula sit amet eu magna."
8
+ title: "Proin turpis urna"
@@ -0,0 +1,14 @@
1
+ ---
2
+ _owner: root
3
+ _timestamp:
4
+ created: 2010-06-30 23:28:18.996299 +09:00
5
+ published: 2010-06-30 23:28:18.996299 +09:00
6
+ updated: 2010-07-01 16:42:28.030389 +09:00
7
+ body: |-
8
+ Duis varius felis quis elit rutrum adipiscing.
9
+ * Nunc faucibus eros rhoncus diam pellentesque porta.
10
+ ** Duis fringilla sem sit amet sem sollicitudin non dapibus augue vulputate.
11
+ * Curabitur aliquet massa eget sem feugiat ac luctus velit faucibus.
12
+ * Proin et felis felis.
13
+ ==Aenean laoreet elit ac massa accumsan ornare.==
14
+ title: "Duis varius felis"
@@ -0,0 +1,8 @@
1
+ ---
2
+ _owner: root
3
+ _timestamp:
4
+ created: 2010-07-01 11:18:25.711634 +09:00
5
+ published: 2010-07-01 11:18:25.711634 +09:00
6
+ updated: 2010-07-01 11:18:25.711634 +09:00
7
+ body: "Integer ultrices pharetra urna, sed aliquet nisl sodales in. Vestibulum eget nulla eu lacus elementum tincidunt et sit amet nisl. Vivamus non justo mauris. Mauris egestas diam ut turpis iaculis consectetur."
8
+ title: "Integer ultrices"
@@ -0,0 +1,19 @@
1
+ ---
2
+ _owner: root
3
+ _timestamp:
4
+ created: 2010-07-01 16:27:10.665692 +09:00
5
+ published: 2010-07-01 16:27:10.665692 +09:00
6
+ updated: 2010-07-01 16:30:34.196737 +09:00
7
+ a:
8
+ ? "20100701_0001"
9
+ :
10
+ f:
11
+ basename: 090106.jpg
12
+ size: 4840
13
+ type: image/jpeg
14
+ body: |-
15
+ Fusce suscipit neque ac arcu egestas varius. *Donec tempor* est id arcu bibendum elementum. Ut gravida, ligula at condimentum bibendum, sapien erat egestas diam, quis convallis ligula nisi quis sapien. Donec vitae nisi in orci sodales malesuada at venenatis felis.
16
+ + Quisque at massa vel tellus
17
+ + Bibendum commodo sed nec tellus
18
+ Suspendisse sit amet est diam, luctus iaculis sapien.
19
+ title: "Fusce suscipit neque"
@@ -0,0 +1,10 @@
1
+ ---
2
+ _owner: frank
3
+ _timestamp:
4
+ created: 2010-07-01 16:33:00.571653 +09:00
5
+ published: 2010-07-01 16:33:00.571653 +09:00
6
+ updated: 2010-07-01 16:33:00.571653 +09:00
7
+ body: |
8
+ This is my blog.
9
+ Haha!
10
+ title: "Hello, folks..."
@@ -0,0 +1,4 @@
1
+ ---
2
+ label: "Frank's Blog"
3
+ admin: frank
4
+ group: []
@@ -0,0 +1,51 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <!DOCTYPE html
3
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
6
+
7
+ <head>
8
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
9
+ <meta name="bike-label" content="Blog" />
10
+ <title>@(label)</title>
11
+ <link rel="stylesheet" href="/css/base.css" type="text/css" media="screen" />
12
+ <link rel="stylesheet" href="/css/coax.css" type="text/css" media="screen" />
13
+ <script type="text/javascript" src="http://code.jquery.com/jquery-1.4.2.min.js"></script>
14
+ <script type="text/javascript" src="/js/base.js"></script>
15
+ <link rel="alternate" title="@(label) RSS" href="@(href)read_rss.xml" type="application/rss+xml">
16
+ </head>
17
+
18
+ <body>
19
+ <div id="container">
20
+ <div id="header">
21
+ <h1><a href=".">@(label)</a></h1>
22
+ $(.crumb)
23
+ </div>
24
+
25
+ <div id="center" class="column">
26
+ <ul id="main" class="app-blog">
27
+ <!-- 1..5 may_preview -->
28
+ <li>
29
+ <div class="label">$(title = text 32 1..32)</div>
30
+ <div class="ibody">
31
+ $(body = textarea-wiki 60*10 1..)
32
+ <div id="a" class="app-attachment">$(f = img 64*64 1..9000)<br/></div>
33
+ <div>by $(_owner) @ $(_timestamp meta-timestamp can_update)</div>
34
+ $(.action_update)
35
+ </div>
36
+ </li>
37
+ </ul>
38
+ </div>
39
+
40
+ <div id="right" class="column">
41
+ $(.action_signup)
42
+ $(.me)
43
+ $(main.action_create)
44
+ $(main.view_ym)
45
+ </div>
46
+
47
+ <div id="footer"></div>
48
+ </div>
49
+ </body>
50
+
51
+ </html>
@@ -0,0 +1,18 @@
1
+ <?xml version="1.0"?>
2
+ <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
3
+ <channel class="bike-xml">
4
+ <atom:link href="@(href)rss.xml" rel="self" type="application/rss+xml" />
5
+ <title>@(label)</title>
6
+ <description></description>
7
+ <link>@(href)</link>
8
+ <language>_(en)</language>
9
+ <generator>Bike</generator>
10
+ <item class="model">
11
+ <title>$(title)</title>
12
+ <link>@(href)</link>
13
+ <description><![CDATA[$(body)]]></description>
14
+ <pubDate>$(_timestamp.rfc2822)</pubDate>
15
+ <guid>@(href)</guid>
16
+ </item>
17
+ </channel>
18
+ </rss>
@@ -0,0 +1,15 @@
1
+ ---
2
+ comment: |
3
+ Hello!
4
+ Hello!
5
+ country: "United States"
6
+ email: john@example.com
7
+ favorite:
8
+ - mystery
9
+ - romance
10
+ file:
11
+ basename: t.txt
12
+ size: 7
13
+ type: text/plain
14
+ name: John
15
+ rating: "1"
@@ -0,0 +1,8 @@
1
+ ---
2
+ comment: Wow.
3
+ country: Germany
4
+ email: lisa@example.com
5
+ favorite:
6
+ - action
7
+ name: Lisa
8
+ rating: "4"
@@ -0,0 +1,9 @@
1
+ ---
2
+ comment: "Oh no."
3
+ country: Japan
4
+ email: akira@example.com
5
+ favorite:
6
+ - action
7
+ - mystery
8
+ name: Akira
9
+ rating: "5"
@@ -0,0 +1,47 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <!DOCTYPE html
3
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
6
+
7
+ <head>
8
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
9
+ <meta name="bike-label" content="Contact Form" />
10
+ <title>@(label)</title>
11
+ <link rel="stylesheet" href="/css/base.css" type="text/css" media="screen" />
12
+ <link rel="stylesheet" href="/css/coax.css" type="text/css" media="screen" />
13
+ <script type="text/javascript" src="http://code.jquery.com/jquery-1.4.2.min.js"></script>
14
+ <script type="text/javascript" src="/js/base.js"></script>
15
+ </head>
16
+
17
+ <body>
18
+ <div id="container">
19
+ <div id="header">
20
+ <h1><a href=".">@(label)</a></h1>
21
+ $(.crumb)
22
+ </div>
23
+
24
+ <div id="center" class="column">
25
+ <div id="main" class="app-contact">
26
+ <!-- 1..100 should_preview -->
27
+ <table>
28
+ <tr><th>Name</th><td>$(name = text 1..64)</td></tr>
29
+ <tr><th>Email</th><td>$(email = text 1..64)</td></tr>
30
+ <tr><th>Favorite</th><td>$(favorite = checkbox action,mystery,romance mandatory)</td></tr>
31
+ <tr><th>Rating</th><td>$(rating = radio 1..5 mandatory)</td></tr>
32
+ <tr><th>Counrty</th><td>$(country = select 'United States',Germany,Japan)</td></tr>
33
+ <tr><th>Comment</th><td>$(comment = textarea-pre 60*6 1..4096)</td></tr>
34
+ <tr><th>File</th><td>$(file = file 0..4096)</td></tr>
35
+ </table>
36
+ </div>
37
+ </div>
38
+
39
+ <div id="right" class="column">
40
+ $(.me)
41
+ </div>
42
+
43
+ <div id="footer"></div>
44
+ </div>
45
+ </body>
46
+
47
+ </html>