parsav  Check-in [c43a1b6e9d]

Overview
Comment:circle management complete
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA3-256: c43a1b6e9d9566740bfc298e737c07b3591f8689fbc4119c68b72a192c661e96
User & Date: lexi on 2021-01-14 17:37:19
Other Links: manifest | tags
Context
2021-01-14
17:38
check in missing file check-in: 576487f566 user: lexi tags: trunk
17:37
circle management complete check-in: c43a1b6e9d user: lexi tags: trunk
05:31
more progress on ui & circles check-in: e78334fe04 user: lexi tags: trunk
Changes

Modified backend/pgsql.t from [dc07991d31] to [4517a951a0].

329
330
331
332
333
334
335
















336
337
338
339
340
341
342
....
2202
2203
2204
2205
2206
2207
2208








2209
2210
2211
2212
	circle_members_fetch_name = {
		params = {uint64, pstring}, sql = [[
			select unnest(members) from parsav_circles where
				($1::bigint = 0 or owner = $1::bigint) and
				name = $2::text
		]];
	};

















	auth_sigtime_user_fetch = {
		params = {uint64}, sql = [[
			select authtime::bigint
			from parsav_actors where id = $1::bigint
		]];
	};
................................................................................

		var rt = pool:alloc(uint64, res.sz)
		for i = 0, res.sz do rt(i) = res:int(uint64,i,0) end

		return rt
	end];









	actor_auth_register_uid = nil; -- TODO better support non-view based auth
}

return b







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







 







>
>
>
>
>
>
>
>




329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
....
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
	circle_members_fetch_name = {
		params = {uint64, pstring}, sql = [[
			select unnest(members) from parsav_circles where
				($1::bigint = 0 or owner = $1::bigint) and
				name = $2::text
		]];
	};

	circle_members_add_uid = {
		params = {uint64, uint64}, cmd = true, sql = [[
			update parsav_circles set
				members = members || $2::bigint
			where id = $1::bigint
		]];
	};

	circle_members_del_uid = {
		params = {uint64, uint64}, cmd = true, sql = [[
			update parsav_circles set
				members = array_remove(members, $2::bigint)
			where id = $1::bigint
		]];
	};

	auth_sigtime_user_fetch = {
		params = {uint64}, sql = [[
			select authtime::bigint
			from parsav_actors where id = $1::bigint
		]];
	};
................................................................................

		var rt = pool:alloc(uint64, res.sz)
		for i = 0, res.sz do rt(i) = res:int(uint64,i,0) end

		return rt
	end];

	circle_members_add_uid = [terra(
		src: &lib.store.source, owner: uint64, subject: uint64
	): {} queries.circle_members_add_uid.exec(src,owner,subject) end];

	circle_members_del_uid = [terra(
		src: &lib.store.source, owner: uint64, subject: uint64
	): {} queries.circle_members_del_uid.exec(src,owner,subject) end];

	actor_auth_register_uid = nil; -- TODO better support non-view based auth
}

return b

Modified config.lua from [e037d77845] to [af9c45003f].

55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
		{'live.js', 'text/javascript'}; -- rrrrrrrr
		{'default-avatar.webp', 'image/webp'}; -- needs inkscape-exclusive svg features
		{'bell.svg', 'image/svg+xml'};
		{'gear.svg', 'image/svg+xml'};
		{'pen.svg', 'image/svg+xml'};
		{'heart.webp', 'image/webp'};
		{'retweet.webp', 'image/webp'};
		{'logo.svg', 'image/svg+xml'};
		{'padlock.svg', 'image/svg+xml'};
		{'warn.svg', 'image/svg+xml'};
		{'query.webp', 'image/webp'};
		{'reply.webp', 'image/webp'};
		{'file.webp', 'image/webp'};
		{'follow.webp', 'image/webp'};
		-- keep in mind before you add anything to this list: these are not







|







55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
		{'live.js', 'text/javascript'}; -- rrrrrrrr
		{'default-avatar.webp', 'image/webp'}; -- needs inkscape-exclusive svg features
		{'bell.svg', 'image/svg+xml'};
		{'gear.svg', 'image/svg+xml'};
		{'pen.svg', 'image/svg+xml'};
		{'heart.webp', 'image/webp'};
		{'retweet.webp', 'image/webp'};
		{'icon.svg', 'image/svg+xml'};
		{'padlock.svg', 'image/svg+xml'};
		{'warn.svg', 'image/svg+xml'};
		{'query.webp', 'image/webp'};
		{'reply.webp', 'image/webp'};
		{'file.webp', 'image/webp'};
		{'follow.webp', 'image/webp'};
		-- keep in mind before you add anything to this list: these are not

Modified render/conf/circles.t from [2450dbe8a2] to [48e04956e4].

6
7
8
9
10
11
12

13
14
15
16
17
18
19
local terra 
render_conf_circles(co: &lib.srv.convo, path: lib.mem.ptr(pref)): pstr
	if path.ct == 2 then
		var circs = co.srv:circle_search(&co.srv.pool, co.who.id, 0)
		var ui: data.view.conf_circles
		if circs.ct == 0 then
			ui.newattr = ' open';

		else
			ui.newattr = '';
			var circlst = co:stra(86)
			for i = 0, circs.ct do
				circlst:lpush '<li><a href="/conf/circles/':shpush(circs(i).cid):lpush'">'
					   :ppush(circs(i).name)
					   :lpush '</a></li>'







>







6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
local terra 
render_conf_circles(co: &lib.srv.convo, path: lib.mem.ptr(pref)): pstr
	if path.ct == 2 then
		var circs = co.srv:circle_search(&co.srv.pool, co.who.id, 0)
		var ui: data.view.conf_circles
		if circs.ct == 0 then
			ui.newattr = ' open';
			ui.circles = '';
		else
			ui.newattr = '';
			var circlst = co:stra(86)
			for i = 0, circs.ct do
				circlst:lpush '<li><a href="/conf/circles/':shpush(circs(i).cid):lpush'">'
					   :ppush(circs(i).name)
					   :lpush '</a></li>'

Modified render/nav.t from [665c264b07] to [079076f046].

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
local terra 
render_nav(co: &lib.srv.convo)
	var t = co:stra(64)
	if co.who ~= nil or co.srv.cfg.pol_sec == lib.srv.secmode.public then
		t:lpush(' <a accesskey="t" href="/"><u>t</u>imeline</a>')
	end
	if co.who ~= nil then
		t:lpush(' <a accesskey="m" href="/media"><u>m</u>edia</a> <a accesskey="d" href="/doc"><u>d</u>ocs</a> <hr> <a accesskey="p" href="'):push(co.who.xid,0):lpush('" class="ident">')
		t:push(co.who.handle,0)
		t:lpush('</a> <a accesskey="g" href="/logout">lo<u>g</u> out</a> <a class="pen" accesskey="c" href="/compose"><u>c</u>ompose</a> <a class="gear" accesskey="o" href="/conf">c<u>o</u>nfigure</a> <a class="bell" accesskey="x" href="/notices">notices (<u>x</u>)</a>')
	else
		t:lpush(' <a accesskey="d" href="/doc"><u>d</u>ocs</a> <a accesskey="g" href="/login">lo<u>g</u> in</a>')
	end
	return t:finalize()
end
return render_nav







|








2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
local terra 
render_nav(co: &lib.srv.convo)
	var t = co:stra(64)
	if co.who ~= nil or co.srv.cfg.pol_sec == lib.srv.secmode.public then
		t:lpush(' <a accesskey="t" href="/"><u>t</u>imeline</a>')
	end
	if co.who ~= nil then
		t:lpush(' <a accesskey="m" href="/media"><u>m</u>edia</a> <a accesskey="d" href="/doc"><u>d</u>ocs</a> <hr> <a accesskey="p" href="/'):push(co.who.xid,0):lpush('" class="ident">')
		t:push(co.who.handle,0)
		t:lpush('</a> <a accesskey="g" href="/logout">lo<u>g</u> out</a> <a class="pen" accesskey="c" href="/compose"><u>c</u>ompose</a> <a class="gear" accesskey="o" href="/conf">c<u>o</u>nfigure</a> <a class="bell" accesskey="x" href="/notices">notices (<u>x</u>)</a>')
	else
		t:lpush(' <a accesskey="d" href="/doc"><u>d</u>ocs</a> <a accesskey="g" href="/login">lo<u>g</u> in</a>')
	end
	return t:finalize()
end
return render_nav

Modified render/profile.t from [e47888d2bc] to [c63a8aaea6].

194
195
196
197
198
199
200


201
202
203
204
205
206
207
208







209
210

211
212
213
214
215
216
217
		comments:lpush('<li style="--co:80">blocked</li>')
	end

	if relationship.recip.follow() then
		comments:lpush('<li style="--co:30">follows you</li>')
	end



	var circpanel = co:stra(128)
	var allcircs = co.srv:circle_search(&co.srv.pool, co.who.id, 0)
	if allcircs:ref() then
		var mycircs = co.srv:circle_memberships_uid(&co.srv.pool, co.who.id, actor.id)
		for i=0, allcircs.ct do
			circpanel:lpush '<label><input type="checkbox" name="circle" value="'
			         :shpush(allcircs(i).cid)
					 :lpush '"> '







					 :ppush(allcircs(i).name)
					 :lpush '</label>'

		end
	end

	var profile = data.view.profile {
		nym = fullname;
		bio = bio;
		xid = cs(actor.xid);







>
>
|
|
|
|
|
|
|
|
>
>
>
>
>
>
>
|
|
>







194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
		comments:lpush('<li style="--co:80">blocked</li>')
	end

	if relationship.recip.follow() then
		comments:lpush('<li style="--co:30">follows you</li>')
	end

	var circpanel: lib.str.acc
	if co.aid ~= 0 then
		circpanel = co:stra(128)
		var allcircs = co.srv:circle_search(&co.srv.pool, co.who.id, 0)
		if allcircs:ref() then
			var mycircs = co.srv:circle_memberships_uid(&co.srv.pool, co.who.id, actor.id)
			for i=0, allcircs.ct do
				circpanel:lpush '<label><input type="checkbox" name="circle" value="'
						 :shpush(allcircs(i).cid)
						 :lpush '"'
				for j=0, mycircs.ct do
					if allcircs(i).cid == mycircs(j).cid then
						circpanel:lpush ' checked'
						break
					end
				end
				circpanel:lpush '> '
						 :ppush(allcircs(i).name)
						 :lpush '</label>'
			end
		end
	end

	var profile = data.view.profile {
		nym = fullname;
		bio = bio;
		xid = cs(actor.xid);

Modified route.t from [23df5e6037] to [48c04bb947].

18
19
20
21
22
23
24

















25
26









27







28




29
30
31
32
33
34
35
..
49
50
51
52
53
54
55


56



57
58
59
60
61
62
63
			if rel.recip.block() then
				if act:cmp('follow') or act:cmp('subscribe') then
					co:complain(403,'blocked','you cannot follow a user you are blocked by') return
				end
			end
			if act:cmp('circle') then
				lib.dbg('encircling user!')

















				var iter = co:eachpostv('circle')
				for cid in iter do

















				end




			elseif act:cmp('block') and not rel.rel.block() then
				rel.rel.block = true  rel.recip.follow = false
				co.srv:actor_rel_create([lib.store.relation.idvmap.block], co.who.id, actor.id)
				co.srv:actor_rel_destroy([lib.store.relation.idvmap.follow], actor.id, co.who.id)
			elseif not act:cmp('report') then
				[(function()
					local tests = quote co:complain(400,'bad request','the action you have attempted on this user is not meaningful') return end
................................................................................
			end
		end
	else
		rel.rel:clear()
		rel.recip:clear()
	end



	lib.render.user_page(co, actor, &rel)



end

terra http.actor_profile_xid(co: &lib.srv.convo, uri: lib.mem.ptr(int8), meth: method.t)
	var handle = [lib.mem.ptr(int8)] { ptr = &uri.ptr[2], ct = 0 }
	for i=2,uri.ct do
		if uri.ptr[i] == @'/' or uri.ptr[i] == 0 then handle.ct = i - 2 break end
	end







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>


>
>
>
>
>
>
>
>
>

>
>
>
>
>
>
>
|
>
>
>
>







 







>
>
|
>
>
>







18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
..
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
			if rel.recip.block() then
				if act:cmp('follow') or act:cmp('subscribe') then
					co:complain(403,'blocked','you cannot follow a user you are blocked by') return
				end
			end
			if act:cmp('circle') then
				lib.dbg('encircling user!')
				var allcircs = co.srv:circle_search(&co.srv.pool, co.who.id, 0)
				var mycircs = co.srv:circle_memberships_uid(&co.srv.pool, co.who.id, actor.id)
				var marked = co.srv.pool:alloc(bool, allcircs.ct)
				var member = co.srv.pool:alloc(bool, allcircs.ct)
				for i = 0, marked.ct do
					marked(i) = false
					member(i) = false
					-- search through list of memberships to see if this circle is in them
					-- if it is, set its membership flag
					for j = 0, mycircs.ct do
						if mycircs(j).cid == allcircs(i).cid then
							member(i) = true
						end
					end
				end

				-- which circles did the user mark this time?
				var iter = co:eachpostv('circle')
				for cid in iter do
					var decode, ok = lib.math.shorthand.parse(cid.ptr, cid.ct)
					if ok then
						for i=0, allcircs.ct do
							if allcircs(i).cid == decode then
								marked(i) = true
							end
						end
					end
				end

				-- compute the differential and carry out the appropriate action
				for i = 0, marked.ct do
					if marked(i) ~= member(i) then
						if marked(i) then -- newly marked, add
							co.srv:circle_members_add_uid(allcircs(i).cid, actor.id)
						elseif member(i) then -- unmarked, remove
							co.srv:circle_members_del_uid(allcircs(i).cid, actor.id)
						end
					end
				end

				-- thanks html for making this all so complicated
			elseif act:cmp('block') and not rel.rel.block() then
				rel.rel.block = true  rel.recip.follow = false
				co.srv:actor_rel_create([lib.store.relation.idvmap.block], co.who.id, actor.id)
				co.srv:actor_rel_destroy([lib.store.relation.idvmap.follow], actor.id, co.who.id)
			elseif not act:cmp('report') then
				[(function()
					local tests = quote co:complain(400,'bad request','the action you have attempted on this user is not meaningful') return end
................................................................................
			end
		end
	else
		rel.rel:clear()
		rel.recip:clear()
	end

	var go = co:pgetv('go')
	if not go or go(0) ~= @'/' then
		lib.render.user_page(co, actor, &rel)
	else
		co:reroute(go.ptr)
	end
end

terra http.actor_profile_xid(co: &lib.srv.convo, uri: lib.mem.ptr(int8), meth: method.t)
	var handle = [lib.mem.ptr(int8)] { ptr = &uri.ptr[2], ct = 0 }
	for i=2,uri.ct do
		if uri.ptr[i] == @'/' or uri.ptr[i] == 0 then handle.ct = i - 2 break end
	end

Added static/icon.svg version [1ac35adbf2].





































































































































































































































































































































































>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->

<svg
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:xlink="http://www.w3.org/1999/xlink"
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
   width="1in"
   height="1in"
   viewBox="0 0 25.4 25.400001"
   version="1.1"
   id="svg8"
   inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
   sodipodi:docname="icon.svg"
   enable-background="new">
  <defs
     id="defs2">
    <linearGradient
       inkscape:collect="always"
       id="linearGradient937">
      <stop
         style="stop-color:#20030d;stop-opacity:0.51304346"
         offset="0"
         id="stop933" />
      <stop
         style="stop-color:#20030d;stop-opacity:0.86956519"
         offset="1"
         id="stop935" />
    </linearGradient>
    <linearGradient
       id="linearGradient2322"
       inkscape:collect="always">
      <stop
         id="stop2318"
         offset="0"
         style="stop-color:#ffe0f1;stop-opacity:1;" />
      <stop
         id="stop2320"
         offset="1"
         style="stop-color:#ff3aa6;stop-opacity:0" />
    </linearGradient>
    <linearGradient
       inkscape:collect="always"
       id="linearGradient874">
      <stop
         style="stop-color:#ffe0f1;stop-opacity:1;"
         offset="0"
         id="stop870" />
      <stop
         style="stop-color:#ff37a5;stop-opacity:0"
         offset="1"
         id="stop872" />
    </linearGradient>
    <linearGradient
       inkscape:collect="always"
       xlink:href="#linearGradient874"
       id="linearGradient876"
       x1="1.7326912"
       y1="289.11765"
       x2="22.522418"
       y2="289.11765"
       gradientUnits="userSpaceOnUse" />
    <linearGradient
       inkscape:collect="always"
       xlink:href="#linearGradient2322"
       id="linearGradient884"
       x1="23.480221"
       y1="284.29999"
       x2="4.2095594"
       y2="284.29999"
       gradientUnits="userSpaceOnUse" />
    <linearGradient
       inkscape:collect="always"
       id="linearGradient1775">
      <stop
         style="stop-color:#fef5f8;stop-opacity:1"
         offset="0"
         id="stop1771" />
      <stop
         style="stop-color:#ea2b71;stop-opacity:0"
         offset="1"
         id="stop1773" />
    </linearGradient>
    <radialGradient
       inkscape:collect="always"
       xlink:href="#linearGradient1775"
       id="radialGradient2326"
       gradientUnits="userSpaceOnUse"
       gradientTransform="matrix(1.3917117,0,0,1.3917117,-482.23699,-475.20189)"
       cx="203.03345"
       cy="185.0731"
       fx="203.03345"
       fy="185.0731"
       r="7.9787183" />
    <radialGradient
       inkscape:collect="always"
       xlink:href="#linearGradient937"
       id="radialGradient939"
       cx="204.05836"
       cy="186.09785"
       fx="204.05836"
       fy="186.09785"
       r="1.6704345"
       gradientUnits="userSpaceOnUse"
       gradientTransform="matrix(6.6930296,0,0,6.6930296,-1155.7581,-1053.5082)" />
  </defs>
  <sodipodi:namedview
     id="base"
     pagecolor="#270010"
     bordercolor="#666666"
     borderopacity="1.0"
     inkscape:pageopacity="0.30588235"
     inkscape:pageshadow="2"
     inkscape:zoom="1.4"
     inkscape:cx="221.32923"
     inkscape:cy="219.86917"
     inkscape:document-units="mm"
     inkscape:current-layer="layer1"
     showgrid="false"
     units="in"
     inkscape:object-paths="false"
     inkscape:snap-intersection-paths="true"
     inkscape:window-width="1920"
     inkscape:window-height="1042"
     inkscape:window-x="0"
     inkscape:window-y="38"
     inkscape:window-maximized="0"
     inkscape:snap-global="true"
     inkscape:snap-midpoints="true" />
  <metadata
     id="metadata5">
    <rdf:RDF>
      <cc:Work
         rdf:about="">
        <dc:format>image/svg+xml</dc:format>
        <dc:type
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
        <dc:title></dc:title>
      </cc:Work>
    </rdf:RDF>
  </metadata>
  <g
     inkscape:label="Layer 1"
     inkscape:groupmode="layer"
     id="layer1"
     transform="translate(0,-271.59998)">
    <rect
       style="opacity:1;vector-effect:none;fill:url(#radialGradient939);fill-opacity:1;stroke:none;stroke-width:0.40000004;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
       id="rect931"
       width="15.245533"
       height="15.245533"
       x="202.38794"
       y="184.42741"
       transform="rotate(45)" />
    <path
       sodipodi:nodetypes="cccccccc"
       inkscape:connector-curvature="0"
       d="m 12.7,292.79042 v 0 l 8.490438,-8.49044 1.144891,1.14489 L 12.7,295.0802 1.9197799,284.29998 l 1.144891,-1.14489 z"
       style="fill:url(#linearGradient876);fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
       id="path866" />
    <path
       id="path817"
       style="opacity:1;vector-effect:none;fill:none;fill-opacity:0.22173911;stroke:#ffffff;stroke-width:1.66499996;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
       d="m 12.7,279.40549 v 9.78896 m -2e-6,-9.78898 4.89448,4.89449 -4.89448,4.89447 -4.8944786,-4.89447 z"
       inkscape:connector-curvature="0" />
    <path
       id="path863"
       style="fill:url(#linearGradient884);fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
       d="m 12.7,275.80954 v 0 l -8.4904379,8.49044 -1.144891,-1.14489 9.6353289,-9.63533 10.78022,10.78022 -1.144891,1.14489 z"
       inkscape:connector-curvature="0"
       sodipodi:nodetypes="cccccccc" />
  </g>
</svg>

Modified static/style.scss from [cdc5fd8fbb] to [cb730b53e2].

89
90
91
92
93
94
95

96
97
98
99
100
101
102
...
259
260
261
262
263
264
265

266
267
268
269
270
271
272
...
292
293
294
295
296
297
298


299
300
301
302
303
304
305
306
307
308
309

310
311
312
313
314
315
316
317
....
1265
1266
1267
1268
1269
1270
1271




	--icon: url(/s/heart.webp);
	background-image: linear-gradient(to bottom,
		otone(-41%),
		otone(-43%) 15%,
		otone(-46%) 75%,
		otone(-50%)
	);

	&:hover, &:focus {
		@extend %glow;
		outline: none;
		color: tone(-55%);
		text-shadow: none;
		background: linear-gradient(to bottom,
			otone(-27%),
................................................................................
			}
			> a[href].bell { content: url(/s/bell.svg); }
			> a[href].gear { content: url(/s/gear.svg); }
			> a[href].pen { content: url(/s/pen.svg); }
		}
	}
}


main {
	@extend %content;
	display: block;
	position: relative;
	min-height: calc(100vh - 1.1in);
	margin-top: 0;
................................................................................
		font-size: 80%;
		vertical-align: text-top;
	}
}

body.profile {
	#rel {


		menu {
			display: grid;
			grid-template-columns: 1fr 1fr;
			grid-template-rows: repeat(max-content);
			grid-gap: 0.1in;
			> .opt {
				padding: 0.1in;
				border-radius: 5px;
				border: 1px solid transparent;
				&.on {
					background-color: tone(-30%, -0.7);

					border-color: tone(-20%) transparent;
				}
				> button, > p, > a[href] { display: block; }
				> p { text-align: center; font-size: 80%; margin: 0; margin-top: 0.1in; }
				> button, > a[href] {
					width: max-content;
					margin: auto;
				}
................................................................................
			}
			&:hover {
				background-position: 0 0;
			}
		}
	}
}











>







 







>







 







>
>










|
>
|







 







>
>
>
>
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
...
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
...
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
....
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
	--icon: url(/s/heart.webp);
	background-image: linear-gradient(to bottom,
		otone(-41%),
		otone(-43%) 15%,
		otone(-46%) 75%,
		otone(-50%)
	);
	background-repeat: no-repeat; // necessary to keep gradients from glitching out under failfucks
	&:hover, &:focus {
		@extend %glow;
		outline: none;
		color: tone(-55%);
		text-shadow: none;
		background: linear-gradient(to bottom,
			otone(-27%),
................................................................................
			}
			> a[href].bell { content: url(/s/bell.svg); }
			> a[href].gear { content: url(/s/gear.svg); }
			> a[href].pen { content: url(/s/pen.svg); }
		}
	}
}


main {
	@extend %content;
	display: block;
	position: relative;
	min-height: calc(100vh - 1.1in);
	margin-top: 0;
................................................................................
		font-size: 80%;
		vertical-align: text-top;
	}
}

body.profile {
	#rel {
		.check-panel { margin-top: 0.6em; }
		.check-panel + menu { margin-bottom: 2em; }
		menu {
			display: grid;
			grid-template-columns: 1fr 1fr;
			grid-template-rows: repeat(max-content);
			grid-gap: 0.1in;
			> .opt {
				padding: 0.1in;
				border-radius: 5px;
				border: 1px solid transparent;
				&.on {
					background: linear-gradient(to bottom, tone(-30%, -0.7), transparent 80%);
					background-repeat: no-repeat;
					border-top-color: tone(-30%);
				}
				> button, > p, > a[href] { display: block; }
				> p { text-align: center; font-size: 80%; margin: 0; margin-top: 0.1in; }
				> button, > a[href] {
					width: max-content;
					margin: auto;
				}
................................................................................
			}
			&:hover {
				background-position: 0 0;
			}
		}
	}
}

.modal .check-panel {
	> label { margin: 0.1em; } 
}

Modified view/docskel.tpl from [f103ec4227] to [5468ea7adc].

1
2
3
4
5
6
7
8
9
10
11
12
13
<!doctype html>
<html>
	<head>
		<title>@instance :: @title</title>
		<link rel="stylesheet" type="text/css" href="/s/style.css">
		<link rel="icon" href="/s/logo.svg">
		<script type="text/javascript" src="/s/live.js" async></script>
	</head>
	<body class="@class"@attr>
		<header><div>
			<h1>@title</h1>
			<nav>
				<a accesskey="i" href="/instance"><u>i</u>nstance</a>





|







1
2
3
4
5
6
7
8
9
10
11
12
13
<!doctype html>
<html>
	<head>
		<title>@instance :: @title</title>
		<link rel="stylesheet" type="text/css" href="/s/style.css">
		<link rel="icon" href="/s/icon.svg">
		<script type="text/javascript" src="/s/live.js" async></script>
	</head>
	<body class="@class"@attr>
		<header><div>
			<h1>@title</h1>
			<nav>
				<a accesskey="i" href="/instance"><u>i</u>nstance</a>

Modified view/profile.tpl from [9ae0c0e533] to [8a477a8698].

32
33
34
35
36
37
38

39


40
41
42
43
44
45
46
47
48
49
50

<form id="rel" class="modal" method="post">
<a href="#0" class="button">close</a><div>
	<menu>@relations</menu>
	<div class="check-panel">
		@circles
	</div>

	<button name="act" value="circle">set circles</button>


	<details>
		<summary>sanctions</summary>
		<menu>
			@sanctions
			<div class="opt">
				<a class="neg button" href="/@:xid/report">report</a>
				<p>if this user is violating instance rules, you can report this behavior to moderation staff and ask them to take action. please do not report users simply because you dislike them; this is what the above options are for.</p>
			</div>
		</menu>
	</details>
</div></form>







>
|
>
>











32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53

<form id="rel" class="modal" method="post">
<a href="#0" class="button">close</a><div>
	<menu>@relations</menu>
	<div class="check-panel">
		@circles
	</div>
	<menu class="horizontal choice">
		<button name="act" value="circle" formaction="#">set circles and close</button>
		<button name="act" value="circle" formaction="?go=/conf/circles">set and go to circles</button>
	</menu>
	<details>
		<summary>sanctions</summary>
		<menu>
			@sanctions
			<div class="opt">
				<a class="neg button" href="/@:xid/report">report</a>
				<p>if this user is violating instance rules, you can report this behavior to moderation staff and ask them to take action. please do not report users simply because you dislike them; this is what the above options are for.</p>
			</div>
		</menu>
	</details>
</div></form>