parsav  Check-in [e78334fe04]

Overview
Comment:more progress on ui & circles
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA3-256: e78334fe044290702094265be2b1c24f856b0e8495f7ee16a57405c091143fe7
User & Date: lexi on 2021-01-14 05:31:36
Other Links: manifest | tags
Context
2021-01-14
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
01:11
more work on UI and circles check-in: 03ea3dffe7 user: lexi tags: trunk
Changes

Modified common.lua from [c72e0a0971] to [c868f8cd22].

    74     74   return {
    75     75   	exec = exec;
    76     76   	dump = dump;
    77     77   	ping = ping;
    78     78   	chomp = chomp;
    79     79   	map = map;
    80     80   	tobool = tobool;
           81  +	find = function(lst,pred)
           82  +		for k,v in pairs(lst) do
           83  +			local test = pred(v,k) 
           84  +			if test then return test end
           85  +		end
           86  +		return nil
           87  +	end;
    81     88   	rndstr = function(len)
    82     89   		local s = ''
    83     90   		for i=1,len do
    84     91   			local ofs = math.random(0,10 + 26)
    85     92   			if ofs >= 10 then ofs = 0x60 + (ofs - 10)
    86     93   						 else ofs = 0x30 + ofs end
    87     94   			s = s .. string.char(ofs) 

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

    52     52   		-- we should add support for content-encoding headers and pre-compress
    53     53   		-- the damn things before compiling (also making the binary smaller)
    54     54   		{'style.css', 'text/css'};
    55     55   		{'live.js', 'text/javascript'}; -- rrrrrrrr
    56     56   		{'default-avatar.webp', 'image/webp'}; -- needs inkscape-exclusive svg features
    57     57   		{'bell.svg', 'image/svg+xml'};
    58     58   		{'gear.svg', 'image/svg+xml'};
           59  +		{'pen.svg', 'image/svg+xml'};
    59     60   		{'heart.webp', 'image/webp'};
    60     61   		{'retweet.webp', 'image/webp'};
           62  +		{'logo.svg', 'image/svg+xml'};
    61     63   		{'padlock.svg', 'image/svg+xml'};
    62     64   		{'warn.svg', 'image/svg+xml'};
    63     65   		{'query.webp', 'image/webp'};
    64     66   		{'reply.webp', 'image/webp'};
    65     67   		{'file.webp', 'image/webp'};
    66     68   		{'follow.webp', 'image/webp'};
    67     69   		-- keep in mind before you add anything to this list: these are not

Modified render/nav.t from [5e68ddf43b] to [665c264b07].

     2      2   local terra 
     3      3   render_nav(co: &lib.srv.convo)
     4      4   	var t = co:stra(64)
     5      5   	if co.who ~= nil or co.srv.cfg.pol_sec == lib.srv.secmode.public then
     6      6   		t:lpush(' <a accesskey="t" href="/"><u>t</u>imeline</a>')
     7      7   	end
     8      8   	if co.who ~= nil then
     9         -		t:lpush(' <a accesskey="c" href="/compose"><u>c</u>ompose</a> <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">')
            9  +		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">')
    10     10   		t:push(co.who.handle,0)
    11         -		t:lpush('</a> <a accesskey="g" href="/logout">lo<u>g</u> out</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>')
           11  +		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>')
    12     12   	else
    13     13   		t:lpush(' <a accesskey="d" href="/doc"><u>d</u>ocs</a> <a accesskey="g" href="/login">lo<u>g</u> in</a>')
    14     14   	end
    15     15   	return t:finalize()
    16     16   end
    17     17   return render_nav

Modified render/profile.t from [06727d1481] to [e47888d2bc].

   193    193   	if relationship.rel.block() then
   194    194   		comments:lpush('<li style="--co:80">blocked</li>')
   195    195   	end
   196    196   
   197    197   	if relationship.recip.follow() then
   198    198   		comments:lpush('<li style="--co:30">follows you</li>')
   199    199   	end
          200  +
          201  +	var circpanel = co:stra(128)
          202  +	var allcircs = co.srv:circle_search(&co.srv.pool, co.who.id, 0)
          203  +	if allcircs:ref() then
          204  +		var mycircs = co.srv:circle_memberships_uid(&co.srv.pool, co.who.id, actor.id)
          205  +		for i=0, allcircs.ct do
          206  +			circpanel:lpush '<label><input type="checkbox" name="circle" value="'
          207  +			         :shpush(allcircs(i).cid)
          208  +					 :lpush '"> '
          209  +					 :ppush(allcircs(i).name)
          210  +					 :lpush '</label>'
          211  +		end
          212  +	end
   200    213   
   201    214   	var profile = data.view.profile {
   202    215   		nym = fullname;
   203    216   		bio = bio;
   204    217   		xid = cs(actor.xid);
   205    218   		avatar = cs(actor.avatar);
   206    219   
................................................................................
   208    221   		nfollowers = sn_followers, nmutuals = sn_mutuals;
   209    222   		tweetday = cs(timestr);
   210    223   		timephrase = lib.trn(actor.origin == 0, pstr 'joined', pstr 'known since');
   211    224   
   212    225   		remarks = '';
   213    226   
   214    227   		auxbtn = auxp;
          228  +		circles = circpanel:finalize();
   215    229   		relations = relbtns:finalize();
   216    230   		sanctions = sancbtns:finalize();
   217    231   	}
   218    232   	if comments.sz > 0 then profile.remarks = comments:finalize() end
   219    233   
   220    234   	var ret = profile:poolstr(&co.srv.pool)
   221    235   	-- auxp:free() 
   222    236   	--if actor.bio ~= nil then bio:free() end
   223    237   	--if comments.sz > 0 then profile.remarks:free() end
   224    238   	return ret
   225    239   end
   226    240   
   227    241   return render_profile

Modified route.t from [89c9cb6c12] to [23df5e6037].

    16     16   		if meth == method.post then
    17     17   			var act = co:ppostv('act')
    18     18   			if rel.recip.block() then
    19     19   				if act:cmp('follow') or act:cmp('subscribe') then
    20     20   					co:complain(403,'blocked','you cannot follow a user you are blocked by') return
    21     21   				end
    22     22   			end
    23         -			if act:cmp('block') and not rel.rel.block() then
           23  +			if act:cmp('circle') then
           24  +				lib.dbg('encircling user!')
           25  +				var iter = co:eachpostv('circle')
           26  +				for cid in iter do
           27  +
           28  +				end
           29  +			elseif act:cmp('block') and not rel.rel.block() then
    24     30   				rel.rel.block = true  rel.recip.follow = false
    25     31   				co.srv:actor_rel_create([lib.store.relation.idvmap.block], co.who.id, actor.id)
    26     32   				co.srv:actor_rel_destroy([lib.store.relation.idvmap.follow], actor.id, co.who.id)
    27     33   			elseif not act:cmp('report') then
    28     34   				[(function()
    29     35   					local tests = quote co:complain(400,'bad request','the action you have attempted on this user is not meaningful') return end
    30     36   					for i,v in ipairs(lib.store.relation.members) do

Modified srv.t from [36e7e8aa84] to [fbf604f655].

   413    413   		var ok = true
   414    414   		if self.aid == 0 or self.who.rights.powers.[pow:asvalue()]() == false then
   415    415   			ok = false
   416    416   			self:complain(403,'insufficient privileges',['you lack the <strong>'..pow:asvalue()..'</strong> power and cannot perform this action'])
   417    417   		end
   418    418   	in ok end
   419    419   end)
          420  +
          421  +local pstr2mg, mg2pstr
          422  +do -- aaaaaaaaaaaaaaaaaaaaaaaa
          423  +	mgstr = lib.util.find(lib.net.mg_http_message.entries, function(v)
          424  +		if v.field == 'body' or v[1] == 'body' then return v.type end
          425  +	end)
          426  +	terra pstr2mg(p: pstring): mgstr
          427  +		return mgstr { ptr = p.ptr, len = p.ct }
          428  +	end
          429  +	terra mg2pstr(m: mgstr): pstring
          430  +		return pstring { ptr = m.ptr, ct = m.len }
          431  +	end
          432  +end
   420    433   
   421    434   -- CALL ONLY ONCE PER VAR
   422         -terra convo:postv(name: rawstring)
          435  +terra convo:postv_next(name: pstring, start: &pstring)
   423    436   	if self.varbuf.ptr == nil then
   424    437   		self.varbuf = self.srv.pool:alloc(int8, self.msg.body.len + self.msg.query.len)
   425    438   		self.vbofs = self.varbuf.ptr
   426    439   	end
   427         -	var o = lib.net.mg_http_get_var(&self.msg.body, name, self.vbofs, self.varbuf.ct - (self.vbofs - self.varbuf.ptr))
          440  +	var conv = pstr2mg(@start)
          441  +	var o = lib.net.mg_http_get_var(
          442  +		&conv,
          443  +		name.ptr, self.vbofs,
          444  +		self.varbuf.ct - (self.vbofs - self.varbuf.ptr)
          445  +	)
   428    446   	if o > 0 then
          447  +		start:advance(name.ct + o + 2)
   429    448   		var r = self.vbofs
   430    449   		self.vbofs = self.vbofs + o + 1
   431    450   		@(self.vbofs - 1) = 0
   432    451   		var norm = lib.str.normalize([lib.mem.ptr(int8)]{ptr = r, ct = o})
   433    452   		return norm.ptr, norm.ct
   434    453   	else return nil, 0 end
   435    454   end
   436         -terra convo:ppostv(name: rawstring)
          455  +terra convo:postv(name: pstring)
          456  +	var start = mg2pstr(self.msg.body)
          457  +	return self:postv_next(name, &start)
          458  +end
          459  +terra convo:ppostv(name: pstring)
   437    460   	var s,l = self:postv(name)
   438    461   	return pstring { ptr = s, ct = l }
   439    462   end
          463  +do
          464  +	local struct postiter { co: &convo where: pstring name: pstring }
          465  +	terra convo:eachpostv(name: pstring)
          466  +		return postiter { co = self, where = mg2pstr(self.msg.body), name = name } 
          467  +	end
          468  +	postiter.metamethods.__for = function(self, body)
          469  +		return quote
          470  +			while true do
          471  +				var str, len = self.co:postv_next(self.name, &self.where)
          472  +				if str == nil then break end
          473  +				[ body(`pstring {str, len}) ]
          474  +			end
          475  +		end
          476  +	end
          477  +end
   440    478   
   441    479   terra convo:getv(name: rawstring)
   442    480   	if self.varbuf.ptr == nil then
   443    481   		self.varbuf = self.srv.pool:alloc(int8, self.msg.query.len + self.msg.body.len)
   444    482   		self.vbofs = self.varbuf.ptr
   445    483   	end
   446    484   	var o = lib.net.mg_http_get_var(&self.msg.query, name, self.vbofs, self.varbuf.ct - (self.vbofs - self.varbuf.ptr))

Added static/pen.svg version [3b4f7b1099].

            1  +<?xml version="1.0" encoding="UTF-8" standalone="no"?>
            2  +<!-- Created with Inkscape (http://www.inkscape.org/) -->
            3  +
            4  +<svg
            5  +   xmlns:dc="http://purl.org/dc/elements/1.1/"
            6  +   xmlns:cc="http://creativecommons.org/ns#"
            7  +   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
            8  +   xmlns:svg="http://www.w3.org/2000/svg"
            9  +   xmlns="http://www.w3.org/2000/svg"
           10  +   xmlns:xlink="http://www.w3.org/1999/xlink"
           11  +   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
           12  +   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
           13  +   width="0.2in"
           14  +   height="0.2in"
           15  +   viewBox="0 0 5.0800002 5.0800002"
           16  +   version="1.1"
           17  +   id="svg8"
           18  +   inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
           19  +   sodipodi:docname="pen.svg">
           20  +  <defs
           21  +     id="defs2">
           22  +    <linearGradient
           23  +       id="linearGradient997"
           24  +       inkscape:collect="always">
           25  +      <stop
           26  +         id="stop993"
           27  +         offset="0"
           28  +         style="stop-color:#ffffff;stop-opacity:0.40000001" />
           29  +      <stop
           30  +         id="stop995"
           31  +         offset="1"
           32  +         style="stop-color:#ffffff;stop-opacity:0.22173913" />
           33  +    </linearGradient>
           34  +    <linearGradient
           35  +       inkscape:collect="always"
           36  +       id="linearGradient863">
           37  +      <stop
           38  +         style="stop-color:#ffffff;stop-opacity:0.5518868"
           39  +         offset="0"
           40  +         id="stop859" />
           41  +      <stop
           42  +         style="stop-color:#ffffff;stop-opacity:0;"
           43  +         offset="1"
           44  +         id="stop861" />
           45  +    </linearGradient>
           46  +    <radialGradient
           47  +       inkscape:collect="always"
           48  +       xlink:href="#linearGradient863"
           49  +       id="radialGradient865"
           50  +       cx="2.5399754"
           51  +       cy="295.73944"
           52  +       fx="2.5399754"
           53  +       fy="295.91135"
           54  +       r="1.6620824"
           55  +       gradientTransform="matrix(2.9231276,0,0,2.7982783,-11.452033,-531.55554)"
           56  +       gradientUnits="userSpaceOnUse" />
           57  +    <radialGradient
           58  +       inkscape:collect="always"
           59  +       xlink:href="#linearGradient863"
           60  +       id="radialGradient865-3"
           61  +       cx="2.5399754"
           62  +       cy="295.73944"
           63  +       fx="2.5399754"
           64  +       fy="295.91135"
           65  +       r="1.6620824"
           66  +       gradientTransform="matrix(11.048041,0,0,10.57617,-21.779867,-3114.7234)"
           67  +       gradientUnits="userSpaceOnUse" />
           68  +    <radialGradient
           69  +       inkscape:collect="always"
           70  +       xlink:href="#linearGradient863"
           71  +       id="radialGradient980"
           72  +       gradientUnits="userSpaceOnUse"
           73  +       gradientTransform="matrix(2.9231276,0,0,2.7982783,-11.452033,-531.55554)"
           74  +       cx="4.5320868"
           75  +       cy="295.40598"
           76  +       fx="4.5320868"
           77  +       fy="295.57788"
           78  +       r="1.6620824" />
           79  +    <radialGradient
           80  +       inkscape:collect="always"
           81  +       xlink:href="#linearGradient863"
           82  +       id="radialGradient980-9"
           83  +       gradientUnits="userSpaceOnUse"
           84  +       gradientTransform="matrix(11.048041,0,0,10.57617,-45.140697,-3114.3717)"
           85  +       cx="4.5320868"
           86  +       cy="295.40598"
           87  +       fx="4.5320868"
           88  +       fy="295.57788"
           89  +       r="1.6620824" />
           90  +    <radialGradient
           91  +       inkscape:collect="always"
           92  +       xlink:href="#linearGradient863"
           93  +       id="radialGradient1028-3"
           94  +       gradientUnits="userSpaceOnUse"
           95  +       gradientTransform="matrix(10.458714,0,0,10.012014,-42.732813,-2952.9055)"
           96  +       cx="4.5320868"
           97  +       cy="295.40598"
           98  +       fx="4.5320868"
           99  +       fy="295.57788"
          100  +       r="1.6620824" />
          101  +    <radialGradient
          102  +       inkscape:collect="always"
          103  +       xlink:href="#linearGradient863"
          104  +       id="radialGradient877"
          105  +       gradientUnits="userSpaceOnUse"
          106  +       gradientTransform="matrix(12.203153,0,0,11.681946,-92.753639,-3438.82)"
          107  +       cx="8.0996866"
          108  +       cy="295.31769"
          109  +       fx="8.0996866"
          110  +       fy="295.48959"
          111  +       r="1.6620824" />
          112  +    <radialGradient
          113  +       inkscape:collect="always"
          114  +       xlink:href="#linearGradient997"
          115  +       id="radialGradient884"
          116  +       gradientUnits="userSpaceOnUse"
          117  +       gradientTransform="matrix(2.5465177,-1.6303896e-5,1.5607543e-5,2.4377538,-19.130237,-425.06144)"
          118  +       cx="8.1182146"
          119  +       cy="295.52625"
          120  +       fx="8.1182146"
          121  +       fy="295.69815"
          122  +       r="1.6620824" />
          123  +    <radialGradient
          124  +       inkscape:collect="always"
          125  +       xlink:href="#linearGradient863"
          126  +       id="radialGradient884-3"
          127  +       gradientUnits="userSpaceOnUse"
          128  +       gradientTransform="matrix(12.203153,0,0,11.681946,-97.773171,-3439.9293)"
          129  +       cx="8.0996866"
          130  +       cy="295.31769"
          131  +       fx="8.0996866"
          132  +       fy="295.48959"
          133  +       r="1.6620824" />
          134  +    <radialGradient
          135  +       inkscape:collect="always"
          136  +       xlink:href="#linearGradient863"
          137  +       id="radialGradient915"
          138  +       gradientUnits="userSpaceOnUse"
          139  +       gradientTransform="matrix(22.775335,0,0,21.802581,-167.8904,-6432.8016)"
          140  +       cx="8.0996866"
          141  +       cy="295.31769"
          142  +       fx="8.0996866"
          143  +       fy="295.48959"
          144  +       r="1.6620824" />
          145  +    <radialGradient
          146  +       inkscape:collect="always"
          147  +       xlink:href="#linearGradient863"
          148  +       id="radialGradient923"
          149  +       gradientUnits="userSpaceOnUse"
          150  +       gradientTransform="matrix(1.5516004,-1.2029723e-6,1.1515923e-6,1.4853302,-6.8816939,-144.29024)"
          151  +       cx="7.9044895"
          152  +       cy="295.25067"
          153  +       fx="7.9044895"
          154  +       fy="295.25067"
          155  +       r="1.6620824" />
          156  +    <radialGradient
          157  +       inkscape:collect="always"
          158  +       xlink:href="#linearGradient863"
          159  +       id="radialGradient884-9"
          160  +       gradientUnits="userSpaceOnUse"
          161  +       gradientTransform="matrix(12.203153,0,0,11.681946,-97.77317,-3439.9294)"
          162  +       cx="8.0996866"
          163  +       cy="295.31769"
          164  +       fx="8.0996866"
          165  +       fy="295.48959"
          166  +       r="1.6620824" />
          167  +    <radialGradient
          168  +       inkscape:collect="always"
          169  +       xlink:href="#linearGradient863"
          170  +       id="radialGradient959"
          171  +       gradientUnits="userSpaceOnUse"
          172  +       gradientTransform="matrix(3.2287509,0,0,3.0908482,-24.416093,-618.0091)"
          173  +       cx="8.0996866"
          174  +       cy="295.31769"
          175  +       fx="8.0996866"
          176  +       fy="295.48959"
          177  +       r="1.6620824" />
          178  +    <radialGradient
          179  +       inkscape:collect="always"
          180  +       xlink:href="#linearGradient863"
          181  +       id="radialGradient969"
          182  +       gradientUnits="userSpaceOnUse"
          183  +       gradientTransform="matrix(3.2287509,0,0,3.0908482,-24.416093,-618.0091)"
          184  +       cx="8.0996866"
          185  +       cy="295.31769"
          186  +       fx="8.0996866"
          187  +       fy="295.48959"
          188  +       r="1.6620824" />
          189  +    <radialGradient
          190  +       inkscape:collect="always"
          191  +       xlink:href="#linearGradient863"
          192  +       id="radialGradient971"
          193  +       gradientUnits="userSpaceOnUse"
          194  +       gradientTransform="matrix(3.2287509,0,0,3.0908482,-24.321599,-617.98547)"
          195  +       cx="8.4411459"
          196  +       cy="294.28815"
          197  +       fx="8.4411459"
          198  +       fy="294.46005"
          199  +       r="1.6620824" />
          200  +    <radialGradient
          201  +       inkscape:collect="always"
          202  +       xlink:href="#linearGradient863"
          203  +       id="radialGradient983"
          204  +       gradientUnits="userSpaceOnUse"
          205  +       gradientTransform="matrix(3.2287509,0,0,3.0908482,-24.593269,-617.99727)"
          206  +       cx="8.0996866"
          207  +       cy="295.31769"
          208  +       fx="8.0996866"
          209  +       fy="295.48959"
          210  +       r="1.6620824" />
          211  +  </defs>
          212  +  <sodipodi:namedview
          213  +     id="base"
          214  +     pagecolor="#2f000f"
          215  +     bordercolor="#666666"
          216  +     borderopacity="1.0"
          217  +     inkscape:pageopacity="0"
          218  +     inkscape:pageshadow="2"
          219  +     inkscape:zoom="5.6"
          220  +     inkscape:cx="30.052814"
          221  +     inkscape:cy="10.293303"
          222  +     inkscape:document-units="mm"
          223  +     inkscape:current-layer="layer1"
          224  +     showgrid="false"
          225  +     units="in"
          226  +     inkscape:window-width="1920"
          227  +     inkscape:window-height="1042"
          228  +     inkscape:window-x="0"
          229  +     inkscape:window-y="38"
          230  +     inkscape:window-maximized="0" />
          231  +  <metadata
          232  +     id="metadata5">
          233  +    <rdf:RDF>
          234  +      <cc:Work
          235  +         rdf:about="">
          236  +        <dc:format>image/svg+xml</dc:format>
          237  +        <dc:type
          238  +           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
          239  +        <dc:title></dc:title>
          240  +      </cc:Work>
          241  +    </rdf:RDF>
          242  +  </metadata>
          243  +  <g
          244  +     inkscape:label="Layer 1"
          245  +     inkscape:groupmode="layer"
          246  +     id="layer1"
          247  +     transform="translate(0,-291.91998)">
          248  +    <path
          249  +       style="opacity:1;vector-effect:none;fill:url(#radialGradient971);fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
          250  +       d="m 4.4124934,292.1625 c 0,0 -1.1108656,0.38981 -1.6371093,1.10122 -0.5262438,0.71139 -1.227832,2.09497 -1.227832,2.09497 0.1266883,-0.01 0.3994588,-0.18501 0.3994588,-0.18501 l 0.5555216,-0.98443 c 0,0 0.3995245,-0.0443 0.8433593,-0.16847 -0.1282446,-0.0703 -0.2669278,-0.14068 -0.3922241,-0.18397 0,0 0.4669658,0.007 0.7456911,0.0667 0.3067058,-0.11755 0.5913485,-0.27672 0.7327717,-0.49403 0.1385432,-0.21288 0.1746504,-0.42615 0.1679485,-0.6165 -0.2153555,-0.0167 -0.7131349,-0.0134 -0.7131349,-0.0134 0.3030665,-0.14907 0.5896433,-0.18827 0.6888469,-0.19998 -0.05315,-0.24735 -0.1632976,-0.41703 -0.1632976,-0.41703 z"
          251  +       id="path852"
          252  +       inkscape:connector-curvature="0" />
          253  +    <path
          254  +       style="opacity:1;vector-effect:none;fill:url(#radialGradient923);fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
          255  +       d="m 3.986763,294.05518 c -0.131622,-0.008 -0.2734744,0.006 -0.4382161,0.0646 -0.064856,0.0259 -0.1406203,0.0387 -0.1421104,0.14211 -0.00535,0.11274 0.060433,0.15383 0.1576131,0.16433 -0.082549,0.0209 -0.1693344,0.0404 -0.2092894,0.0754 0.1085829,0.0613 0.2280063,0.0826 0.3586343,0.0625 0,0 -0.2872568,0.1916 -0.4495848,0.49609 l 0.5286497,0.0507 a 0.15252899,0.15252899 0 0 1 0.127124,0.2129 l -0.280086,0.64699 c 0.3274787,0.0428 0.6397358,0.0399 0.9777179,-0.0584 0.4754632,-0.77165 -0.4206462,-1.34824 -0.4206462,-1.34824 0.1306288,0.0201 0.2500527,-0.002 0.3586345,-0.0625 -0.039955,-0.0349 -0.1267404,-0.0547 -0.2092896,-0.0754 0.09718,-0.0102 0.1624465,-0.0516 0.1570963,-0.16433 -0.00149,-0.10321 -0.076738,-0.11621 -0.1415933,-0.14211 -0.1219084,-0.0273 -0.2430323,-0.0568 -0.374654,-0.0646 z"
          256  +       id="path919"
          257  +       inkscape:connector-curvature="0" />
          258  +    <path
          259  +       style="opacity:1;vector-effect:none;fill:url(#radialGradient884);fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
          260  +       d="m 0.83863466,294.98018 -0.59066162,1.08676 2.91765136,0.61392 0.6139159,-1.41697 -1.5962849,-0.154 -0.084749,0.14986 a 0.17411337,0.17411337 0 0 1 -0.058911,0.061 c 0,-10e-6 -0.07109,0.0468 -0.1617473,0.0956 -0.090657,0.0488 -0.1834986,0.10679 -0.3167765,0.11731 a 0.17411337,0.17411337 0 0 1 -0.1679484,-0.25218 c 0,0 0.096479,-0.18004 0.125057,-0.23565 z"
          261  +       id="path932"
          262  +       inkscape:connector-curvature="0" />
          263  +  </g>
          264  +</svg>

Modified static/style.scss from [2db0a5b279] to [cdc5fd8fbb].

   171    171   		outline: none;
   172    172   		@extend %glow;
   173    173   	}
   174    174   }
   175    175   select { width: 100%; }
   176    176   
   177    177   @mixin glass {
          178  +	box-shadow: inset 0 0 1.5em tone(-56%);
   178    179   	@supports (backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px)) {
   179    180   		backdrop-filter: blur(40px);
   180    181   		-webkit-backdrop-filter: blur(40px);
   181    182   		background-color: tone(-53%, -0.7);
   182    183   	}
   183    184   	@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
   184    185   		background-color: tone(-53%, -0.1);
................................................................................
   242    243   				//padding: calc((25% - 1em)/2) 0.15in;
   243    244   				&, &::after { transition: 0.3s; }
   244    245   				text-shadow: 1px 1px 1px black;
   245    246   				&:hover{
   246    247   					transform: scale(1.2);
   247    248   				}
   248    249   			}
   249         -			> a[href].bell, a[href].gear {
          250  +			> a[href].bell, a[href].gear, a[href].pen {
   250    251   				height: 2em;
          252  +				width: 2em;
   251    253   				padding: 0.125in 0.05in;
   252    254   				filter: drop-shadow(1px 1px 3px tone(-5%));
   253    255   				&:hover {
   254    256   					filter: drop-shadow(1px 1px 3px tone(-5%))
   255    257   						drop-shadow(0 0 10px tone(-5%));
   256    258   				}
   257    259   			}
   258    260   			> a[href].bell { content: url(/s/bell.svg); }
   259    261   			> a[href].gear { content: url(/s/gear.svg); }
          262  +			> a[href].pen { content: url(/s/pen.svg); }
   260    263   		}
   261    264   	}
   262    265   }
   263    266   
   264    267   main {
   265    268   	@extend %content;
   266    269   	display: block;
................................................................................
   300    303   			grid-gap: 0.1in;
   301    304   			> .opt {
   302    305   				padding: 0.1in;
   303    306   				border-radius: 5px;
   304    307   				border: 1px solid transparent;
   305    308   				&.on {
   306    309   					background-color: tone(-30%, -0.7);
   307         -					box-shadow: 0 0 10px tone(-30%);
   308         -					border-color: tone(-20%);
          310  +					border-color: tone(-20%) transparent;
   309    311   				}
   310    312   				> button, > p, > a[href] { display: block; }
   311    313   				> p { text-align: center; font-size: 80%; margin: 0; margin-top: 0.1in; }
   312    314   				> button, > a[href] {
   313    315   					width: max-content;
   314    316   					margin: auto;
   315    317   				}

Modified view/docskel.tpl from [e2ac83ad65] to [f103ec4227].

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

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

    29     29   		</div>
    30     30   	</form>
    31     31   </div>
    32     32   
    33     33   <form id="rel" class="modal" method="post">
    34     34   <a href="#0" class="button">close</a><div>
    35     35   	<menu>@relations</menu>
    36         -	<details>
    37         -		<summary>circles</summary>
    38         -		<button name="act" value="encircle">commit</button>
    39         -	</details>
           36  +	<div class="check-panel">
           37  +		@circles
           38  +	</div>
           39  +	<button name="act" value="circle">set circles</button>
    40     40   	<details>
    41     41   		<summary>sanctions</summary>
    42     42   		<menu>
    43     43   			@sanctions
    44     44   			<div class="opt">
    45     45   				<a class="neg button" href="/@:xid/report">report</a>
    46     46   				<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>
    47     47   			</div>
    48     48   		</menu>
    49     49   	</details>
    50     50   </div></form>