wip
This commit is contained in:
		
							parent
							
								
									712c7cac44
								
							
						
					
					
						commit
						194492234e
					
				
							
								
								
									
										18
									
								
								README.md
								
								
								
								
							
							
						
						
									
										18
									
								
								README.md
								
								
								
								
							|  | @ -1,16 +1,6 @@ | |||
| # Kompact.io site | ||||
| 
 | ||||
| ## Commands | ||||
| 
 | ||||
| recompile css | ||||
| ```sh | ||||
|   tailwindcss -i ./content/css/main.css -o ./content/css/mini.css --minify | ||||
| ``` | ||||
| 
 | ||||
| build, serve and watch | ||||
| ```sh | ||||
|   cabal run site -- watch | ||||
| ``` | ||||
| 
 | ||||
| deploy | ||||
| ```sh | ||||
|   rsync -r --delete ./_site/* genesis:/var/www/kompactio-landing/ | ||||
| ``` | ||||
| Enter devshell, and run `menu` | ||||
| See flake for details. | ||||
|  |  | |||
|  | @ -5,7 +5,8 @@ | |||
| @font-face { | ||||
|   /* Set in tailwindconfig */ | ||||
|   font-family: "jetbrains-mono"; | ||||
|   src: local("jetbrains-mono"), | ||||
|   src: | ||||
|     local("jetbrains-mono"), | ||||
|     url("/fonts/JetBrainsMono-Medium.woff2") format("woff2"); | ||||
| } | ||||
| 
 | ||||
|  | @ -18,7 +19,9 @@ article>section> :is(pre, p, h1, h2, h3, h4, h5, h6) { | |||
| } | ||||
| 
 | ||||
| article > section { | ||||
|   font-family: "Lucida" Grande, sans-serif; | ||||
|   font-family: | ||||
|     "Lucida" Grande, | ||||
|     sans-serif; | ||||
| } | ||||
| 
 | ||||
| article > section > :is(h1, h2, h3, h4, h5, h6, code) { | ||||
|  | @ -91,3 +94,15 @@ article ol { | |||
|   margin-left: 1rem; | ||||
|   list-style: decimal inside; | ||||
| } | ||||
| 
 | ||||
| #footnotes { | ||||
|   padding-top: 1rem; | ||||
| } | ||||
| 
 | ||||
| #footnotes > ol > li { | ||||
|   margin-top: 1rem; | ||||
| } | ||||
| 
 | ||||
| #footnotes > ol > li > p { | ||||
|   display: inline; | ||||
| } | ||||
|  |  | |||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							|  | @ -1,3 +1,118 @@ | |||
| /* PrismJS 1.29.0 | ||||
| https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript+bash+haskell+json+nix+racket+rust+scheme */ | ||||
| code[class*=language-],pre[class*=language-]{color:#000;background:0 0;text-shadow:0 1px #fff;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:#b3d4fc}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#b3d4fc}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{color:#9a6e3a;background:hsla(0,0%,100%,.5)}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help} | ||||
| code[class*="language-"], | ||||
| pre[class*="language-"] { | ||||
|   color: #000; | ||||
|   background: 0 0; | ||||
|   text-shadow: 0 1px #fff; | ||||
|   font-family: Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace; | ||||
|   font-size: 1em; | ||||
|   text-align: left; | ||||
|   white-space: pre; | ||||
|   word-spacing: normal; | ||||
|   word-break: normal; | ||||
|   word-wrap: normal; | ||||
|   line-height: 1.5; | ||||
|   -moz-tab-size: 4; | ||||
|   -o-tab-size: 4; | ||||
|   tab-size: 4; | ||||
|   -webkit-hyphens: none; | ||||
|   -moz-hyphens: none; | ||||
|   -ms-hyphens: none; | ||||
|   hyphens: none; | ||||
| } | ||||
| code[class*="language-"] ::-moz-selection, | ||||
| code[class*="language-"]::-moz-selection, | ||||
| pre[class*="language-"] ::-moz-selection, | ||||
| pre[class*="language-"]::-moz-selection { | ||||
|   text-shadow: none; | ||||
|   background: #b3d4fc; | ||||
| } | ||||
| code[class*="language-"] ::selection, | ||||
| code[class*="language-"]::selection, | ||||
| pre[class*="language-"] ::selection, | ||||
| pre[class*="language-"]::selection { | ||||
|   text-shadow: none; | ||||
|   background: #b3d4fc; | ||||
| } | ||||
| @media print { | ||||
|   code[class*="language-"], | ||||
|   pre[class*="language-"] { | ||||
|     text-shadow: none; | ||||
|   } | ||||
| } | ||||
| pre[class*="language-"] { | ||||
|   padding: 1em; | ||||
|   margin: 0.5em 0; | ||||
|   overflow: auto; | ||||
| } | ||||
| :not(pre) > code[class*="language-"], | ||||
| pre[class*="language-"] { | ||||
|   background: #f5f2f0; | ||||
| } | ||||
| :not(pre) > code[class*="language-"] { | ||||
|   padding: 0.1em; | ||||
|   border-radius: 0.3em; | ||||
|   white-space: normal; | ||||
| } | ||||
| .token.cdata, | ||||
| .token.comment, | ||||
| .token.doctype, | ||||
| .token.prolog { | ||||
|   color: #708090; | ||||
| } | ||||
| .token.punctuation { | ||||
|   color: #999; | ||||
| } | ||||
| .token.namespace { | ||||
|   opacity: 0.7; | ||||
| } | ||||
| .token.boolean, | ||||
| .token.constant, | ||||
| .token.deleted, | ||||
| .token.number, | ||||
| .token.property, | ||||
| .token.symbol, | ||||
| .token.tag { | ||||
|   color: #905; | ||||
| } | ||||
| .token.attr-name, | ||||
| .token.builtin, | ||||
| .token.char, | ||||
| .token.inserted, | ||||
| .token.selector, | ||||
| .token.string { | ||||
|   color: #690; | ||||
| } | ||||
| .language-css .token.string, | ||||
| .style .token.string, | ||||
| .token.entity, | ||||
| .token.operator, | ||||
| .token.url { | ||||
|   color: #9a6e3a; | ||||
|   background: hsla(0, 0%, 100%, 0.5); | ||||
| } | ||||
| .token.atrule, | ||||
| .token.attr-value, | ||||
| .token.keyword { | ||||
|   color: #07a; | ||||
| } | ||||
| .token.class-name, | ||||
| .token.function { | ||||
|   color: #dd4a68; | ||||
| } | ||||
| .token.important, | ||||
| .token.regex, | ||||
| .token.variable { | ||||
|   color: #e90; | ||||
| } | ||||
| .token.bold, | ||||
| .token.important { | ||||
|   font-weight: 700; | ||||
| } | ||||
| .token.italic { | ||||
|   font-style: italic; | ||||
| } | ||||
| .token.entity { | ||||
|   cursor: help; | ||||
| } | ||||
|  |  | |||
|  | @ -0,0 +1,59 @@ | |||
| --- | ||||
| title: why is building txs hard? | ||||
| --- | ||||
| 
 | ||||
| ## What is a dapp? | ||||
| 
 | ||||
| A typical dapp has a number of components: | ||||
| 
 | ||||
| - Validators: also called the _on-chain_ part. | ||||
|   The decentralized network of nodes that maintain the chain run this code as part of the process of deciding | ||||
|   whether a tx is to be added to the chain or rejected. | ||||
| - Chain indexing: watches the chain and records the data relevant to the dapp. | ||||
| - Pretty front-end: typically how a user interacts with a dapp. | ||||
| - Tx-building code: A component of the frontend. | ||||
|   It takes data from the user, the user's wallet, the chain-indexer and possibly elsewhere | ||||
|   to construct txs to be submitted to the chain that the validators will deem acceptable. | ||||
| 
 | ||||
| Here we have really described a browser-based plutus dapp. | ||||
| Considering the term _dapp_ more generally, the Daedalus wallet is a dapp which is neither browser based nor involves any Plutus. | ||||
| Cli-based dapps also exist, such as multi-sig using native scripts. | ||||
| 
 | ||||
| ## What is a tx? | ||||
| 
 | ||||
| At its core, the chain is a list of transaction outputs. | ||||
| The chain is changed by submitting a tx which "spends" existing unspent transaction outputs (utxos) and appending new ones. | ||||
| (There's other possible modifications too, like minting native assets and staking _etc_, but the key part is spending.) | ||||
| 
 | ||||
| The on-chain part is where the dapp has its integrity, but users can only interact with the on-chain part of the dapp by submitting txs. | ||||
| 
 | ||||
| The on-chain part is relatively simple. | ||||
| It inspects each tx that it is concerned with, and if it does not like what it sees, it fails. | ||||
| Cardano is, in this sense, a lean chain. | ||||
| 
 | ||||
| The off-chain part is relatively complex. | ||||
| There may be no, one, or many potential valid txs that would satisfy the user's intent. | ||||
| 
 | ||||
| At its core, a transaction is a list of inputs and outputs. | ||||
| The inputs are spent, and the outputs created. | ||||
| It must also contain the necessary signatures. | ||||
| 
 | ||||
| ## Some history | ||||
| 
 | ||||
| When Plutus was first dreamed up, it wasn't just a language. | ||||
| It was whole environment in which dapps would be engaged with. | ||||
| The on-chain and off-chain code were coupled into a single framework with seamless extensive testing. | ||||
| Dapps ran in the _PAB_, Plutus Application Backend. | ||||
| Everything was great. | ||||
| 
 | ||||
| Except that it didn't work. | ||||
| The chain-indexer would periodically fall-over, | ||||
| it required users had to maintain a full node, | ||||
| and the api never matured in to something stable, complete, and bug-free. | ||||
| In addition, the validators it produced were bloated and un-optimized and would quickly hit the constraints of the cardano blockchain. | ||||
| 
 | ||||
| As a result teams turned to coming up with alternatives. | ||||
| One of the first was MLabs and co in creating pluto and plutarch. | ||||
| Later Aiken appeared to meet similar needs. | ||||
| These began resolving issues with the on-chain part. | ||||
| This left the off-chain part wanting. | ||||
|  | @ -1,3 +1,5 @@ | |||
| --- | ||||
| title: Kompact.io | ||||
| --- | ||||
| 
 | ||||
| ## Hero  | ||||
|  |  | |||
|  | @ -20,8 +20,8 @@ This post is borne out of a best effort of how far "zk on Cardano" can be pushed | |||
| ## What is zk? | ||||
| 
 | ||||
| There is no shortage of explanations describing what zk is | ||||
| ( _eg_ [by Vitalik](https://vitalik.ca/general/2021/01/26/snarks.html){target="_blank"} or  | ||||
| [a full mooc](https://zk-learning.org/){target="_blank"} ). | ||||
| ( _eg_ [by Vitalik](https://vitalik.ca/general/2021/01/26/snarks.html){target="\_blank"} or | ||||
| [a full mooc](https://zk-learning.org/){target="\_blank"} ). | ||||
| There is also a reasonable breath to the field of zk that includes things like distributed compute. | ||||
| Zk involves some really neat maths that lets you do some seemingly magical feats | ||||
| and pairs well with blockchain in extending what is functionally possible. | ||||
|  | @ -58,16 +58,15 @@ Snark stands for _Succinct Non-Interactive Argument of Knowledge_. | |||
| And without saying anything more, it means that Alice has to do way less algebra than Bob. | ||||
| In applications this is important because Bob might not be able to lie anymore but he could still waste Alice's time. | ||||
| 
 | ||||
| 
 | ||||
| ## Sudoku snark | ||||
| 
 | ||||
| Sudoku snark was the entrant to Emurgo's hackathon. | ||||
| The summary-pitch-story deck is [here](https://pub.kompact.io/sudoku-snark){target="_blank"}. | ||||
| Links to the associated repos: [plutus-zk](https://github.com/waalge/plutus-zk){target="_blank"}  | ||||
| and [sudoku-snark](https://github.com/waalge/sudoku-snark){target="_blank"}. | ||||
| The summary-pitch-story deck is [here](https://pub.kompact.io/sudoku-snark){target="\_blank"}. | ||||
| Links to the associated repos: [plutus-zk](https://github.com/waalge/plutus-zk){target="\_blank"} | ||||
| and [sudoku-snark](https://github.com/waalge/sudoku-snark){target="\_blank"}. | ||||
| 
 | ||||
| Just after the hackathon got underway there was a | ||||
| [large PR merged](https://github.com/input-output-hk/plutus/pull/5231){target="_blank"}  | ||||
| [large PR merged](https://github.com/input-output-hk/plutus/pull/5231){target="\_blank"} | ||||
| into the main branch of plutus. | ||||
| It's a mammoth culmination of many many months of work. | ||||
| In it were some fundamental primitives needed for running zk algorithms. | ||||
|  | @ -84,7 +83,7 @@ this third part is where things got stuck. | |||
| We did get as far as running a cluster of nodes in the Conway era with the latest version of plutus | ||||
| but unrelated changes seemed to thwart any chance of building transactions here. | ||||
| 
 | ||||
| A quick shout-out to the [modulo-p.io](https://modulo-p.io/){target="_blank"} team. | ||||
| A quick shout-out to the [modulo-p.io](https://modulo-p.io/){target="\_blank"} team. | ||||
| They had a different approach and managed to implement a zk algorithm with the existing plutus primitives. | ||||
| This spared the need to play the foolhardy dependency bumping game with the Cardano node. | ||||
| However, because zk is so arithmetically intense, | ||||
|  |  | |||
|  | @ -1,14 +1,19 @@ | |||
| --- | ||||
| title: "Hydra is neat: You don't need Hydra" | ||||
| title: "Hydra is cool: You don't need Hydra" | ||||
| date: 2023-09-20 | ||||
| --- | ||||
| 
 | ||||
| ## Hydra is neat | ||||
| ## Hydra is cool | ||||
| 
 | ||||
| Hydra[^1] is a very cool project. It is a layer 2 for Cardano that is _isomorphic_ to the L1. | ||||
| Here isomorphic means that Plutus runs in Hydra just like it does on the L1. | ||||
| That dapp you've just toiled over for months to run on the L1 can be put in Hydra and 'just work'. | ||||
| 
 | ||||
| [^1]: | ||||
|     This post does not distinguish between Hydra and Hydra Head referring to both as Hydra. | ||||
|     If you want to know more about Hydra, then check out their | ||||
|     [explainers](https://hydra.family/head-protocol/core-concepts). | ||||
| 
 | ||||
| ## Hydra's compromise | ||||
| 
 | ||||
| Hydra boasts it can achieve higher throughput and lower transaction fees compared to the Cardano L1 | ||||
|  | @ -17,7 +22,7 @@ You may be asking _If my dapp just works on Hydra and it's better in all key res | |||
| then why don't we all just use Hydra?_. | ||||
| The answer is because these improvements come at a cost. | ||||
| Consensus in Hydra differs from that on the L1. | ||||
| Hydra doesn't use ouroboros; all participating hydra nodes  | ||||
| Hydra doesn't use ouroboros. Instead all participating hydra nodes | ||||
| must sign-off on all updates to the chain state. | ||||
| Practically speaking, far fewer nodes can participate in Hydra | ||||
| and one quiet node stops the whole Hydra chain updating. | ||||
|  | @ -27,22 +32,22 @@ Not great for an L1. | |||
| 
 | ||||
| Hydra is an example of a way to do state channels. | ||||
| A state channel relies on the integrity of the L1, while accumulating state separately from it (L2). | ||||
| At some point the the layers are brought into sync. | ||||
| At some point the layers are brought into sync. | ||||
| This is when funds on the L1 can be unlocked, and/or the state of the L2 updated. | ||||
| 
 | ||||
| Hydra could be thought to be providing some future-proofing. | ||||
| It is possible for a Hydra instance to run indefinitely | ||||
| and scripts yet written will be executable in some already running instance.  | ||||
| and Plutus scripts not yet written will be executable in some already running instance. | ||||
| However, because Hydra's consensus is so brittle the longevity of an instance is not something to depend on. | ||||
| Each and any transaction may be its last. | ||||
| 
 | ||||
| A key question is when considering Hydra is _Do I need isomorphic-ness?_. | ||||
| A key question when considering Hydra is _Do I need isomorphic-ness?_. | ||||
| If you know all your business logic before instantiation | ||||
| then the answer is **no, you don't care for isomorphic-ness**. | ||||
| Instead, you can roll-your-own L2. It depends on your use case as to how much work that ends up being. | ||||
| Instead, you can roll-your-own L2. | ||||
| It depends on your use case as to how much work that ends up being. | ||||
| It can be very simple. | ||||
| 
 | ||||
| 
 | ||||
| ## You don't want Hydra | ||||
| 
 | ||||
| In Hydra, the latest agreed state in the L2 is the one that the L1 will accept as the most legitimate. | ||||
|  | @ -51,7 +56,7 @@ This is a sensible default. | |||
| Suppose however you have a game of poker where one player learns that they've lost and rage quits. | ||||
| From the game's perspective, that final transaction should be forced through - the player's loss is inevitable. | ||||
| At present this isn't possible with Hydra. | ||||
| If a party doesn't sign then a state isn't valid. | ||||
| If a party doesn't sign, then a state isn't valid. | ||||
| 
 | ||||
| In another use case, suppose there is some particularly intense on-chain verification | ||||
| that would be prohibitive on the L1 but that you'd like the results of which to | ||||
|  | @ -65,8 +70,8 @@ Both the cases above are resolvable with custom sync logic. | |||
| 
 | ||||
| ## An Example: Subbit.xyz | ||||
| 
 | ||||
| Probably the simplest, non-trivial example using state channels is [Subbit.xyz][https://subbit.xyz].  | ||||
| Subbit.xyz is premised on the observation that subscription is very common use case:  | ||||
| Probably the simplest, non-trivial example using state channels is [Subbit.xyz](https://subbit.xyz). | ||||
| Subbit.xyz is premised on the observation that subscription is a very common use case: | ||||
| there are two parties where one pays the other incrementally. | ||||
| It sacrifices generality to gain absolutely minimal overhead for both parties. | ||||
| 
 | ||||
|  | @ -78,7 +83,7 @@ All logic is known at instantiation. | |||
| A consumer needs only to keep track of their account balance, | ||||
| ascertain the cost of each outgoing request, | ||||
| and produce valid signatures for a few dozen bytes of data at a time. | ||||
| They don't need to watch the L1 and its a non-chatty protocol. | ||||
| They don't need to watch the L1 and it's a non-chatty protocol. | ||||
| The low resource needs opens it up to applications | ||||
| on intermittently connected user devices such as laptops and mobile, | ||||
| and even micro-controllers. | ||||
|  | @ -90,15 +95,10 @@ The low resource needs for a provider means they have the ability to serve more | |||
| 
 | ||||
| ## Hydra for QoL | ||||
| 
 | ||||
| When Hydra reaches a point of maturity that its plug and play,  | ||||
| When Hydra reaches a point of maturity that it's plug and play, | ||||
| it's potentially far easier to deploy with Hydra then roll-your-own L2. | ||||
| Isomorphic-ness gives Hydra incredible flexibility and generality. | ||||
| You don't need isomorphic-ness but because of it, Hydra could be an easy and convenient solution. | ||||
| 
 | ||||
| As for custom sync logic, it is surely the case that there is a tranche on interesting applications where | ||||
| its far easier and more effective to reuse Hydra infra and modify it than creating your own L2 from scratch.  | ||||
| 
 | ||||
| [^1]: This post does not distinguish between Hydra and Hydra Head referring to both as Hydra.  | ||||
| If you want to know more about Hydra, then check out their  | ||||
| [explainers](https://hydra.family/head-protocol/core-concepts). | ||||
| 
 | ||||
| As for custom sync logic, it is surely the case that there is a tranche of interesting applications where | ||||
| it's far easier and more effective to reuse Hydra infra and modify it than creating your own L2 from scratch. | ||||
|  |  | |||
|  | @ -1,15 +1,18 @@ | |||
| document.addEventListener('DOMContentLoaded', function () { | ||||
| document.addEventListener("DOMContentLoaded", function () { | ||||
|   // Get all "navbar-burger" elements
 | ||||
|   var $navbarBurgers = Array.prototype.slice.call(document.querySelectorAll('.navbar-burger'), 0); | ||||
|   var $navbarBurgers = Array.prototype.slice.call( | ||||
|     document.querySelectorAll(".navbar-burger"), | ||||
|     0, | ||||
|   ); | ||||
|   // Check if there are any navbar burgers
 | ||||
|   if ($navbarBurgers.length > 0) { | ||||
|     // Add a click event on each of them
 | ||||
|     $navbarBurgers.forEach(function ($el) { | ||||
|       $el.addEventListener('click', function () { | ||||
|       $el.addEventListener("click", function () { | ||||
|         // Get the "main-nav" element
 | ||||
|         var $target = document.getElementById('main-nav'); | ||||
|         var $target = document.getElementById("main-nav"); | ||||
|         // Toggle the class on "main-nav"
 | ||||
|         $target.classList.toggle('hidden'); | ||||
|         $target.classList.toggle("hidden"); | ||||
|       }); | ||||
|     }); | ||||
|   } | ||||
|  |  | |||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										86
									
								
								flake.lock
								
								
								
								
							
							
						
						
									
										86
									
								
								flake.lock
								
								
								
								
							|  | @ -2,15 +2,14 @@ | |||
|   "nodes": { | ||||
|     "devshell": { | ||||
|       "inputs": { | ||||
|         "nixpkgs": "nixpkgs", | ||||
|         "systems": "systems" | ||||
|         "nixpkgs": "nixpkgs" | ||||
|       }, | ||||
|       "locked": { | ||||
|         "lastModified": 1688380630, | ||||
|         "narHash": "sha256-8ilApWVb1mAi4439zS3iFeIT0ODlbrifm/fegWwgHjA=", | ||||
|         "lastModified": 1735644329, | ||||
|         "narHash": "sha256-tO3HrHriyLvipc4xr+Ewtdlo7wM1OjXNjlWRgmM7peY=", | ||||
|         "owner": "numtide", | ||||
|         "repo": "devshell", | ||||
|         "rev": "f9238ec3d75cefbb2b42a44948c4e8fb1ae9a205", | ||||
|         "rev": "f7795ede5b02664b57035b3b757876703e2c3eac", | ||||
|         "type": "github" | ||||
|       }, | ||||
|       "original": { | ||||
|  | @ -24,11 +23,11 @@ | |||
|         "nixpkgs-lib": "nixpkgs-lib" | ||||
|       }, | ||||
|       "locked": { | ||||
|         "lastModified": 1683560683, | ||||
|         "narHash": "sha256-XAygPMN5Xnk/W2c1aW0jyEa6lfMDZWlQgiNtmHXytPc=", | ||||
|         "lastModified": 1738453229, | ||||
|         "narHash": "sha256-7H9XgNiGLKN1G1CgRh0vUL4AheZSYzPm+zmZ7vxbJdo=", | ||||
|         "owner": "hercules-ci", | ||||
|         "repo": "flake-parts", | ||||
|         "rev": "006c75898cf814ef9497252b022e91c946ba8e17", | ||||
|         "rev": "32ea77a06711b758da0ad9bd6a844c5740a87abd", | ||||
|         "type": "github" | ||||
|       }, | ||||
|       "original": { | ||||
|  | @ -38,11 +37,11 @@ | |||
|     }, | ||||
|     "flake-root": { | ||||
|       "locked": { | ||||
|         "lastModified": 1680964220, | ||||
|         "narHash": "sha256-dIdTYcf+KW9a4pKHsEbddvLVSfR1yiAJynzg2x0nfWg=", | ||||
|         "lastModified": 1723604017, | ||||
|         "narHash": "sha256-rBtQ8gg+Dn4Sx/s+pvjdq3CB2wQNzx9XGFq/JVGCB6k=", | ||||
|         "owner": "srid", | ||||
|         "repo": "flake-root", | ||||
|         "rev": "f1c0b93d05bdbea6c011136ba1a135c80c5b326c", | ||||
|         "rev": "b759a56851e10cb13f6b8e5698af7b59c44be26e", | ||||
|         "type": "github" | ||||
|       }, | ||||
|       "original": { | ||||
|  | @ -53,11 +52,11 @@ | |||
|     }, | ||||
|     "haskell-flake": { | ||||
|       "locked": { | ||||
|         "lastModified": 1684180957, | ||||
|         "narHash": "sha256-qtEZf4gcmQU5ePbFtltqpAS0PajWLURVC7nuoS46dSk=", | ||||
|         "lastModified": 1739669127, | ||||
|         "narHash": "sha256-2s3wYTqKq7aBa41VHWg/G2XAOii8MW+WAMtLdgy1cek=", | ||||
|         "owner": "srid", | ||||
|         "repo": "haskell-flake", | ||||
|         "rev": "4e1c76de8795608bb47295c018b37a563c492fd2", | ||||
|         "rev": "eabf8cf32e5f6a267ea637e1b3eabc9b7ddf29e1", | ||||
|         "type": "github" | ||||
|       }, | ||||
|       "original": { | ||||
|  | @ -68,11 +67,11 @@ | |||
|     }, | ||||
|     "nixpkgs": { | ||||
|       "locked": { | ||||
|         "lastModified": 1677383253, | ||||
|         "narHash": "sha256-UfpzWfSxkfXHnb4boXZNaKsAcUrZT9Hw+tao1oZxd08=", | ||||
|         "lastModified": 1722073938, | ||||
|         "narHash": "sha256-OpX0StkL8vpXyWOGUD6G+MA26wAXK6SpT94kLJXo6B4=", | ||||
|         "owner": "NixOS", | ||||
|         "repo": "nixpkgs", | ||||
|         "rev": "9952d6bc395f5841262b006fbace8dd7e143b634", | ||||
|         "rev": "e36e9f57337d0ff0cf77aceb58af4c805472bfae", | ||||
|         "type": "github" | ||||
|       }, | ||||
|       "original": { | ||||
|  | @ -84,29 +83,23 @@ | |||
|     }, | ||||
|     "nixpkgs-lib": { | ||||
|       "locked": { | ||||
|         "dir": "lib", | ||||
|         "lastModified": 1682879489, | ||||
|         "narHash": "sha256-sASwo8gBt7JDnOOstnps90K1wxmVfyhsTPPNTGBPjjg=", | ||||
|         "owner": "NixOS", | ||||
|         "repo": "nixpkgs", | ||||
|         "rev": "da45bf6ec7bbcc5d1e14d3795c025199f28e0de0", | ||||
|         "type": "github" | ||||
|         "lastModified": 1738452942, | ||||
|         "narHash": "sha256-vJzFZGaCpnmo7I6i416HaBLpC+hvcURh/BQwROcGIp8=", | ||||
|         "type": "tarball", | ||||
|         "url": "https://github.com/NixOS/nixpkgs/archive/072a6db25e947df2f31aab9eccd0ab75d5b2da11.tar.gz" | ||||
|       }, | ||||
|       "original": { | ||||
|         "dir": "lib", | ||||
|         "owner": "NixOS", | ||||
|         "ref": "nixos-unstable", | ||||
|         "repo": "nixpkgs", | ||||
|         "type": "github" | ||||
|         "type": "tarball", | ||||
|         "url": "https://github.com/NixOS/nixpkgs/archive/072a6db25e947df2f31aab9eccd0ab75d5b2da11.tar.gz" | ||||
|       } | ||||
|     }, | ||||
|     "nixpkgs_2": { | ||||
|       "locked": { | ||||
|         "lastModified": 1684385584, | ||||
|         "narHash": "sha256-O7y0gK8OLIDqz+LaHJJyeu09IGiXlZIS3+JgEzGmmJA=", | ||||
|         "lastModified": 1739446958, | ||||
|         "narHash": "sha256-+/bYK3DbPxMIvSL4zArkMX0LQvS7rzBKXnDXLfKyRVc=", | ||||
|         "owner": "NixOS", | ||||
|         "repo": "nixpkgs", | ||||
|         "rev": "48a0fb7aab511df92a17cf239c37f2bd2ec9ae3a", | ||||
|         "rev": "2ff53fe64443980e139eaa286017f53f88336dd0", | ||||
|         "type": "github" | ||||
|       }, | ||||
|       "original": { | ||||
|  | @ -118,16 +111,16 @@ | |||
|     }, | ||||
|     "nixpkgs_3": { | ||||
|       "locked": { | ||||
|         "lastModified": 1680945546, | ||||
|         "narHash": "sha256-8FuaH5t/aVi/pR1XxnF0qi4WwMYC+YxlfdsA0V+TEuQ=", | ||||
|         "lastModified": 1735554305, | ||||
|         "narHash": "sha256-zExSA1i/b+1NMRhGGLtNfFGXgLtgo+dcuzHzaWA6w3Q=", | ||||
|         "owner": "nixos", | ||||
|         "repo": "nixpkgs", | ||||
|         "rev": "d9f759f2ea8d265d974a6e1259bd510ac5844c5d", | ||||
|         "rev": "0e82ab234249d8eee3e8c91437802b32c74bb3fd", | ||||
|         "type": "github" | ||||
|       }, | ||||
|       "original": { | ||||
|         "owner": "nixos", | ||||
|         "ref": "nixos-unstable", | ||||
|         "ref": "nixpkgs-unstable", | ||||
|         "repo": "nixpkgs", | ||||
|         "type": "github" | ||||
|       } | ||||
|  | @ -142,31 +135,16 @@ | |||
|         "treefmt-nix": "treefmt-nix" | ||||
|       } | ||||
|     }, | ||||
|     "systems": { | ||||
|       "locked": { | ||||
|         "lastModified": 1681028828, | ||||
|         "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", | ||||
|         "owner": "nix-systems", | ||||
|         "repo": "default", | ||||
|         "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", | ||||
|         "type": "github" | ||||
|       }, | ||||
|       "original": { | ||||
|         "owner": "nix-systems", | ||||
|         "repo": "default", | ||||
|         "type": "github" | ||||
|       } | ||||
|     }, | ||||
|     "treefmt-nix": { | ||||
|       "inputs": { | ||||
|         "nixpkgs": "nixpkgs_3" | ||||
|       }, | ||||
|       "locked": { | ||||
|         "lastModified": 1684416994, | ||||
|         "narHash": "sha256-KkZ9diPRl3Y05TngWYs/QhZKnI/3tA3s+2Hhmei8FnE=", | ||||
|         "lastModified": 1738953846, | ||||
|         "narHash": "sha256-yrK3Hjcr8F7qS/j2F+r7C7o010eVWWlm4T1PrbKBOxQ=", | ||||
|         "owner": "numtide", | ||||
|         "repo": "treefmt-nix", | ||||
|         "rev": "42045102f90cfd23ca44ae4ef8362180fefcd7fd", | ||||
|         "rev": "4f09b473c936d41582dd744e19f34ec27592c5fd", | ||||
|         "type": "github" | ||||
|       }, | ||||
|       "original": { | ||||
|  |  | |||
							
								
								
									
										35
									
								
								flake.nix
								
								
								
								
							
							
						
						
									
										35
									
								
								flake.nix
								
								
								
								
							|  | @ -28,10 +28,11 @@ | |||
|         # system. | ||||
| 
 | ||||
|         haskellProjects.default = { | ||||
|           # packages.haskell-template.root = ./.;  # Auto-discovered by haskell-flake | ||||
|           overrides = self: super: { }; | ||||
|           devShell = { | ||||
|             tools = hp: { | ||||
|               fourmolu = hp.fourmolu; | ||||
|               hoogle = hp.hoogle; | ||||
|               haskell-language-server = hp.haskell-language-server; | ||||
|               treefmt = config.treefmt.build.wrapper; | ||||
|             } // config.treefmt.build.programs; | ||||
|             hlsCheck.enable = false; | ||||
|  | @ -65,7 +66,33 @@ | |||
| 
 | ||||
| 
 | ||||
|         # Equivalent to  inputs'.nixpkgs.legacyPackages.hello; | ||||
|         devShells.default = pkgs.mkShell { | ||||
|         devShells.default = | ||||
|           let | ||||
|             menu = pkgs.writeShellScriptBin "menu" | ||||
|               '' | ||||
|                 echo -e "\nCommands available: \n${ | ||||
|                   builtins.foldl' (x: y: x + " -> " + (pkgs.lib.getName y) + "\n") "" my-packages | ||||
|                 }" | ||||
|               ''; | ||||
|             my-packages = [ | ||||
|               menu | ||||
|               build | ||||
|               watch | ||||
|               deploy | ||||
|             ]; | ||||
|             build = pkgs.writeShellScriptBin "build" '' | ||||
|               tailwindcss -i ./content/css/main.css -o ./content/css/mini.css --minify | ||||
|               cabal run site -- build | ||||
|             ''; | ||||
|             watch = pkgs.writeShellScriptBin "watch" '' | ||||
|               tailwindcss -i ./content/css/main.css -o ./content/css/mini.css --minify | ||||
|               cabal run site -- watch | ||||
|             ''; | ||||
|             deploy = pkgs.writeShellScriptBin "deploy" '' | ||||
|               rsync -r --delete ./docs/* genesis:/var/www/kompactio-landing/ | ||||
|             ''; | ||||
|           in | ||||
|           pkgs.mkShell { | ||||
|             inputsFrom = [ | ||||
|               config.haskellProjects.default.outputs.devShell | ||||
|               config.flake-root.devShell | ||||
|  | @ -78,7 +105,7 @@ | |||
|               nodePackages_latest.typescript-language-server | ||||
|               haskellPackages.hakyll | ||||
|               zlib | ||||
|           ]; | ||||
|             ] ++ my-packages; | ||||
|           }; | ||||
|       }; | ||||
|       flake = { | ||||
|  |  | |||
|  | @ -1,13 +0,0 @@ | |||
| name:               example | ||||
| version:            0.1.0.0 | ||||
| build-type:         Simple | ||||
| cabal-version:      >= 1.10 | ||||
| 
 | ||||
| executable site | ||||
|   main-is:          site.hs | ||||
|   build-depends:    base == 4.* | ||||
|                   , hakyll == 4.15.* | ||||
|                   , hip == 1.5.* | ||||
|                   , filepath | ||||
|   ghc-options:      -threaded -rtsopts -with-rtsopts=-N | ||||
|   default-language: Haskell2010 | ||||
|  | @ -0,0 +1,15 @@ | |||
| name:          site | ||||
| version:       0.1.0.0 | ||||
| build-type:    Simple | ||||
| cabal-version: >=1.10 | ||||
| 
 | ||||
| executable site | ||||
|   main-is:          site.hs | ||||
|   build-depends: | ||||
|       base      >=4    && <5 | ||||
|     , filepath | ||||
|     , hakyll    >=4.16 && <4.17 | ||||
|     , hip       >=1.5  && <1.6 | ||||
| 
 | ||||
|   ghc-options:      -threaded -rtsopts -with-rtsopts=-N | ||||
|   default-language: Haskell2010 | ||||
							
								
								
									
										22
									
								
								site.hs
								
								
								
								
							
							
						
						
									
										22
									
								
								site.hs
								
								
								
								
							|  | @ -1,9 +1,9 @@ | |||
| -------------------------------------------------------------------------------- | ||||
| {-# LANGUAGE OverloadedStrings #-} | ||||
| 
 | ||||
| import Data.Monoid (mappend) | ||||
| import Hakyll | ||||
| import System.FilePath (splitExtension, joinPath, splitDirectories, replaceExtension) | ||||
| 
 | ||||
| import System.FilePath (joinPath, replaceExtension, splitDirectories, splitExtension) | ||||
| 
 | ||||
| -------------------------------------------------------------------------------- | ||||
| main :: IO () | ||||
|  | @ -30,7 +30,8 @@ main = hakyll $ do | |||
| 
 | ||||
|     match "content/posts/*.md" $ do | ||||
|         route rmPrefixMd | ||||
|         compile $ pandocCompiler | ||||
|         compile $ | ||||
|             pandocCompiler | ||||
|                 >>= loadAndApplyTemplate "templates/post.html" postCtx | ||||
|                 >>= loadAndApplyTemplate "templates/default.html" postCtx | ||||
|                 >>= relativizeUrls | ||||
|  | @ -40,15 +41,19 @@ main = hakyll $ do | |||
|         compile $ do | ||||
|             posts <- recentFirst =<< loadAll "content/posts/*.md" | ||||
|             let archiveCtx = | ||||
|                     listField "posts" postCtx (return posts) `mappend` | ||||
|                     constField "title" "Blog" `mappend` | ||||
|                     defaultContext | ||||
|                     listField "posts" postCtx (return posts) | ||||
|                         `mappend` constField "title" "Blog" | ||||
|                         `mappend` defaultContext | ||||
| 
 | ||||
|             makeItem "" | ||||
|                 >>= loadAndApplyTemplate "templates/blog.html" archiveCtx | ||||
|                 >>= loadAndApplyTemplate "templates/default.html" archiveCtx | ||||
|                 >>= relativizeUrls | ||||
| 
 | ||||
|     -- match "content/index/*" $ do | ||||
|     --   compile $  | ||||
|     --     pandocCompilerWith x   | ||||
| 
 | ||||
| 
 | ||||
|     match "content/index.md" $ do | ||||
|         route rmPrefixMd | ||||
|  | @ -63,12 +68,11 @@ main = hakyll $ do | |||
| 
 | ||||
|     match "templates/*" $ compile templateBodyCompiler | ||||
| 
 | ||||
| 
 | ||||
| -------------------------------------------------------------------------------- | ||||
| postCtx :: Context String | ||||
| postCtx = | ||||
|     dateField "date" "%Y-%m-%d" `mappend` | ||||
|     defaultContext | ||||
|     dateField "date" "%Y-%m-%d" | ||||
|         `mappend` defaultContext | ||||
| 
 | ||||
| setExtensionInner :: String -> FilePath -> FilePath | ||||
| setExtensionInner = flip replaceExtension | ||||
|  |  | |||
|  | @ -1,19 +1,15 @@ | |||
| /** @type {import('tailwindcss').Config} */ | ||||
| module.exports = { | ||||
|   content: [ | ||||
|     "./content/**/*.{html,js}", | ||||
|     "./templates/**/*.{html,js}", | ||||
|   ], | ||||
|   content: ["./content/**/*.{html,js}", "./templates/**/*.{html,js}"], | ||||
|   theme: { | ||||
|     extend: {}, | ||||
|     fontFamily: { | ||||
|       'sans' : ['jetbrains-mono',], | ||||
|       sans: ["jetbrains-mono"], | ||||
|     }, | ||||
|     typography: (theme) => ({}), | ||||
|   }, | ||||
|   darkMode: 'class', | ||||
|   darkMode: "class", | ||||
|   variants: {}, | ||||
|   // plugins: [require('@tailwindcss/typography')],
 | ||||
|   plugins: [], | ||||
| } | ||||
| 
 | ||||
| }; | ||||
|  |  | |||
|  | @ -1,27 +1,15 @@ | |||
| <section id="about" class="py-12 px-2 flex flex-col gap-12"> | ||||
|   <header class="text-3xl"> | ||||
|     # about | ||||
|   </header> | ||||
|   <header class="text-3xl"># about</header> | ||||
|   <div> | ||||
|     Kompact.io is dapp dev house. | ||||
| 
 | ||||
|     Our focus: | ||||
|     Kompact.io is dapp dev house. Our focus: | ||||
|     <ul class="list-decoration"> | ||||
|       <li> | ||||
|         safety-first | ||||
|       </li> | ||||
|       <li> | ||||
|         fast turn around | ||||
|       </li> | ||||
|       <li> | ||||
|         integration support | ||||
|       </li> | ||||
|       <li>safety-first</li> | ||||
|       <li>fast turn around</li> | ||||
|       <li>integration support</li> | ||||
|     </ul> | ||||
|     <div> | ||||
|       Our typical process: | ||||
|       <div> | ||||
|         Idea -> Spec -> Impl -> Test -> Handover | ||||
|       </div> | ||||
|       <div>Idea -> Spec -> Impl -> Test -> Handover</div> | ||||
|     </div> | ||||
|   </div> | ||||
| </section> | ||||
|  | @ -1,7 +1,5 @@ | |||
| <section id="services" class="py-6 px-2 flex flex-col gap-12"> | ||||
|   <header class="text-3xl"> | ||||
|     # blog | ||||
|   </header> | ||||
|   <header class="text-3xl"># blog</header> | ||||
|   <div class="text-gray-800 dark:text-gray-200 mt-4"> | ||||
|     A nascent initiative sharing some of the things happening at Kompact.io. | ||||
|   </div> | ||||
|  |  | |||
|  | @ -1,9 +1,8 @@ | |||
| <section id="contact" class="py-12 px-2 flex flex-col gap-12"> | ||||
|   <header class="text-3xl"> | ||||
|     # contact | ||||
|   </header> | ||||
|   <header class="text-3xl"># contact</header> | ||||
|   <div class="text-gray-800 dark:text-gray-200 mt-4"> | ||||
|     Questions? We'll be happy to help answer any of your questions. Send us an email and we'll get back to you shortly. | ||||
|     Questions? We'll be happy to help answer any of your questions. Send us an | ||||
|     email and we'll get back to you shortly. | ||||
|   </div> | ||||
|   <div> | ||||
|     Reach us on : <a href="mailto:kompactio@proton.me">kompactio@proton.me</a> | ||||
|  |  | |||
|  | @ -1,11 +1,10 @@ | |||
| <!doctype html> | ||||
| <html class=""> | ||||
| 
 | ||||
|   <head> | ||||
|   <meta charset="UTF-8"> | ||||
|   <meta name="viewport" content="width=device-width, initial-scale=1.0"> | ||||
|   <link rel="icon" type="image/x-icon" href="/favicon.png"> | ||||
|   <link href="/css/mini.css" rel="stylesheet"> | ||||
|     <meta charset="UTF-8" /> | ||||
|     <meta name="viewport" content="width=device-width, initial-scale=1.0" /> | ||||
|     <link rel="icon" type="image/x-icon" href="/favicon.png" /> | ||||
|     <link href="/css/mini.css" rel="stylesheet" /> | ||||
|     <link href="/css/prism.css" rel="stylesheet" /> | ||||
|     <title>$title$</title> | ||||
|   </head> | ||||
|  | @ -13,20 +12,21 @@ | |||
|     // On page load or when changing themes, best to add inline in `head` to avoid FOUC | ||||
|     function updateTheme() { | ||||
|       if ( | ||||
|       localStorage.theme === 'dark' || | ||||
|       (!('theme' in localStorage) && window.matchMedia('(prefers-color-scheme: dark)').matches) | ||||
|         localStorage.theme === "dark" || | ||||
|         (!("theme" in localStorage) && | ||||
|           window.matchMedia("(prefers-color-scheme: dark)").matches) | ||||
|       ) { | ||||
|       document.documentElement.classList.add('dark') | ||||
|         document.documentElement.classList.add("dark"); | ||||
|       } else { | ||||
|       document.documentElement.classList.remove('dark') | ||||
|         document.documentElement.classList.remove("dark"); | ||||
|       } | ||||
| 
 | ||||
|     } | ||||
|   updateTheme() | ||||
|     updateTheme(); | ||||
|   </script> | ||||
| 
 | ||||
| <body class="bg-white text-gray-900  min-h-screen | ||||
|   dark:bg-gradient-to-br dark:from-slate-950 dark:to-black dark:text-white"> | ||||
|   <body | ||||
|     class="bg-white text-gray-900 min-h-screen dark:bg-gradient-to-br dark:from-slate-950 dark:to-black dark:text-white" | ||||
|   > | ||||
|     <div class="container mx-auto"> | ||||
|       <hr /> | ||||
|       $partial("templates/nav.html")$ | ||||
|  | @ -38,5 +38,4 @@ | |||
|   </body> | ||||
| 
 | ||||
|   <script src="/scripts/prism.js"></script> | ||||
| 
 | ||||
| </html> | ||||
|  | @ -1,21 +1,33 @@ | |||
| <section id="footer" class="py-12 px-2 flex flex-row gap-12 mx-2 sm:mx-4 items-start justify-between | ||||
| text-gray-800 dark:text-gray-200 dark:fill-white"> | ||||
|   <div class="text-sm"> | ||||
|     ® 2023 kompact.io ™ All Rights Reserved. | ||||
|   </div> | ||||
| <section | ||||
|   id="footer" | ||||
|   class="py-12 px-2 flex flex-row gap-12 mx-2 sm:mx-4 items-start justify-between text-gray-800 dark:text-gray-200 dark:fill-white" | ||||
| > | ||||
|   <div class="text-sm">® 2023 kompact.io ™ All Rights Reserved.</div> | ||||
|   <div class="flex flex-row gap-4"> | ||||
|     <a href="https://www.linkedin.com/in/dominic-algernon-wallis-123b42187/"> | ||||
|       <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512" height="20" preserveAspectRatio="xMidYMid meet"> | ||||
|       <svg | ||||
|         xmlns="http://www.w3.org/2000/svg" | ||||
|         viewBox="0 0 448 512" | ||||
|         height="20" | ||||
|         preserveAspectRatio="xMidYMid meet" | ||||
|       > | ||||
|         <!--! Font Awesome Pro 6.4.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. --> | ||||
|         <path | ||||
|           d="M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3zM135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5zm282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9V416z" /> | ||||
|           d="M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3zM135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5zm282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9V416z" | ||||
|         /> | ||||
|       </svg> | ||||
|     </a> | ||||
|     <a href="https://twitter.com/waalge"> | ||||
|       <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" height="20" preserveAspectRatio="xMidYMid meet"> | ||||
|       <svg | ||||
|         xmlns="http://www.w3.org/2000/svg" | ||||
|         viewBox="0 0 512 512" | ||||
|         height="20" | ||||
|         preserveAspectRatio="xMidYMid meet" | ||||
|       > | ||||
|         <!--! Font Awesome Pro 6.4.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. --> | ||||
|         <path | ||||
|           d="M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z" /> | ||||
|           d="M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z" | ||||
|         /> | ||||
|       </svg> | ||||
|     </a> | ||||
|   </div> | ||||
|  |  | |||
|  | @ -1,10 +1,11 @@ | |||
| <section id="hero" class="py-8 px-2 h-96 min-h-[50vh] m-auto"> | ||||
|   <div class="h-full flex justify-around align-center items-center"> | ||||
|     <div class="text-6xl"> | ||||
|       ⟨K⟩ | ||||
|     </div> | ||||
|     <div class="text-6xl">⟨K⟩</div> | ||||
|     <div class="flex flex-col gap-2 truncate"> | ||||
|       <div>withKompact $ <span class="text-red-500 dark:text-yellow-400">do</span> </div> | ||||
|       <div> | ||||
|         withKompact $ | ||||
|         <span class="text-red-500 dark:text-yellow-400">do</span> | ||||
|       </div> | ||||
|       <div><span class="text-gray-400">· ·</span> dapp <- lean dev</div> | ||||
|       <div><span class="text-gray-400">· ·</span> run dapp</div> | ||||
|     </div> | ||||
|  |  | |||
|  | @ -9,7 +9,8 @@ | |||
|     <div> | ||||
|       <ul class="flex flex-row gap-4 md:gap-8"> | ||||
|         <li> | ||||
|           <button onClick=" | ||||
|           <button | ||||
|             onClick=" | ||||
|           (() => { | ||||
|             if (!('theme' in localStorage)) { | ||||
|               localStorage.theme = 'light' | ||||
|  | @ -22,17 +23,16 @@ | |||
|               } | ||||
|             updateTheme()   | ||||
|             })() | ||||
|           ">◧</button> | ||||
|           " | ||||
|           > | ||||
|             ◧ | ||||
|           </button> | ||||
|         </li> | ||||
|         <li> | ||||
|           <a href="/index.html#contact"> | ||||
|             contact | ||||
|           </a> | ||||
|           <a href="/index.html#contact"> contact </a> | ||||
|         </li> | ||||
|         <li> | ||||
|           <a href="/blog.html"> | ||||
|             blog | ||||
|           </a> | ||||
|           <a href="/blog.html"> blog </a> | ||||
|         </li> | ||||
|       </ul> | ||||
|     </div> | ||||
|  |  | |||
|  | @ -2,9 +2,7 @@ | |||
|   $for(posts)$ | ||||
|   <li class="mt-4"> | ||||
|     <a href="$url$"> | ||||
|       <span class="text-gray-800 dark:text-gray-200"> | ||||
|         $date$ :: | ||||
|       </span> | ||||
|       <span class="text-gray-800 dark:text-gray-200"> $date$ :: </span> | ||||
|       $title$ | ||||
|     </a> | ||||
|   </li> | ||||
|  |  | |||
|  | @ -1,20 +1,11 @@ | |||
| <article class="mx-auto px-4 max-w-prose"> | ||||
|   <section class="header"> | ||||
|     <h1> | ||||
|       $title$ | ||||
|     </h1> | ||||
|     <h1>$title$</h1> | ||||
|     $if(date)$ | ||||
|     <p> | ||||
|       Posted on $date$ | ||||
|     </p> | ||||
|     $endif$ | ||||
|     $if(author)$ | ||||
|     <p> | ||||
|       by $author$ | ||||
|     </p> | ||||
|     <p>Posted on $date$</p> | ||||
|     $endif$ $if(author)$ | ||||
|     <p>by $author$</p> | ||||
|     $endif$ | ||||
|   </section> | ||||
|   <section> | ||||
|     $body$ | ||||
|   </section> | ||||
|   <section>$body$</section> | ||||
| </article> | ||||
|  | @ -1,46 +1,39 @@ | |||
| <section id="pricing" class="py-12 px-2 flex flex-col gap-12"> | ||||
|   <header class="text-3xl"> | ||||
|     # pricing | ||||
|   </header> | ||||
|   <header class="text-3xl"># pricing</header> | ||||
|   <div class="text-gray-800 dark:text-gray-200 mt-4"> | ||||
|     Plutus development has traditionally meant long development schedules, and expensive ( $ 25k+/mo FTE) engineers. | ||||
|     We can work with you at competitive rates in either deliverable or retainer based engagements. | ||||
|     Plutus development has traditionally meant long development schedules, and | ||||
|     expensive ( $ 25k+/mo FTE) engineers. We can work with you at | ||||
|     competitive rates in either deliverable or retainer based engagements. | ||||
|   </div> | ||||
|   <div class="grid grid-cols-1 gap-4 sm:grid-cols-2 sm:gap-8 md:mx-24"> | ||||
|     <div class="max-w-48"> | ||||
|       <div class="text-1xl font-bold"> | ||||
|         ## retainer | ||||
|       </div> | ||||
|       <div class="text-gray-800 dark:text-gray-200 mt-4"> | ||||
|         Time-based | ||||
|       </div> | ||||
|       <div class="text-gray-800 dark:text-gray-200 mt-4"> | ||||
|   <div class="flex flex-col justify-between gap-4 sm:flex-row sm:gap-8"> | ||||
|     <div class="flex-1"> | ||||
|       <div class="text-1xl font-bold">## retainer</div> | ||||
|       <p class="text-gray-800 dark:text-gray-200 mt-4">Time-based</p> | ||||
|       <p class="text-gray-800 dark:text-gray-200 mt-4"> | ||||
|         Still figuring out your project scope? | ||||
|       </div> | ||||
|       <div class="text-gray-800 dark:text-gray-200 mt-4"> | ||||
|       </p> | ||||
|       <p class="text-gray-800 dark:text-gray-200 mt-4"> | ||||
|         Need an extra pair of hands on an existing project? | ||||
|       </div> | ||||
|       <div class="text-gray-800 dark:text-gray-200 mt-4"> | ||||
|       </p> | ||||
|       <p class="text-gray-800 dark:text-gray-200 mt-4"> | ||||
|         Then a retainer based engagement is for you. | ||||
|       </p> | ||||
|     </div> | ||||
|     </div> | ||||
|     <div class="max-w-48"> | ||||
|       <div class="text-1xl font-bold"> | ||||
|         ## deliverable | ||||
|       </div> | ||||
|       <div class="text-gray-800 dark:text-gray-200 mt-4"> | ||||
|         Output-based | ||||
|       </div> | ||||
|       <div class="text-gray-800 dark:text-gray-200 mt-4"> | ||||
|     <div class="flex-1"> | ||||
|       <div class="text-1xl font-bold">## deliverable</div> | ||||
|       <p class="text-gray-800 dark:text-gray-200 mt-4">Output-based</p> | ||||
|       <p class="text-gray-800 dark:text-gray-200 mt-4"> | ||||
|         You know what you want and need help implementing it? | ||||
|       </div> | ||||
|       <div class="text-gray-800 dark:text-gray-200 mt-4"> | ||||
|       </p> | ||||
|       <p class="text-gray-800 dark:text-gray-200 mt-4"> | ||||
|         We'll first produce a spec on how the dapp will operate technically. | ||||
|         This involves discussing different options and trade-offs on things from UX to validator complexity. | ||||
|       </div> | ||||
|       <div class="text-gray-800 dark:text-gray-200 mt-4"> | ||||
|         Once settled we'll begin the implementation phase and finally integration phase. | ||||
|       </div> | ||||
|         This involves discussing different options and trade-offs on things from | ||||
|         UX to validator complexity. | ||||
|       </p> | ||||
|       <p class="text-gray-800 dark:text-gray-200 mt-4"> | ||||
|         Once settled we'll begin the implementation phase and finally | ||||
|         integration phase. | ||||
|       </p> | ||||
|     </div> | ||||
|   </div> | ||||
| </section> | ||||
|  | @ -1,34 +1,29 @@ | |||
| <section id="services" class="py-12 px-2 flex flex-col gap-12"> | ||||
|   <header class="text-3xl"> | ||||
|     # services | ||||
|   </header> | ||||
|   <header class="text-3xl"># services</header> | ||||
|   <div class="text-gray-800 dark:text-gray-200 mt-4"> | ||||
|     We are cardano native dapp dev outfit focused on helping you going from 0 to launch ASAP. | ||||
|     We are cardano native dapp dev outfit focused on helping you going from 0 to | ||||
|     launch ASAP. | ||||
|   </div> | ||||
| 
 | ||||
|   <div class="grid grid-cols-1 gap-4 sm:grid-cols-3 sm:gap-8"> | ||||
|     <div class="max-w-48"> | ||||
|       <div class="text-1xl font-bold"> | ||||
|         ## strategy | ||||
|       </div> | ||||
|       <div class="text-1xl font-bold">## strategy</div> | ||||
|       <div class="text-gray-800 dark:text-gray-200 mt-4"> | ||||
|         We'll work with you to validate your concept, and translate it into an implementable Proof of Concept | ||||
|         We'll work with you to validate your concept, and translate it into an | ||||
|         implementable Proof of Concept | ||||
|       </div> | ||||
|     </div> | ||||
|     <div class="max-w-48"> | ||||
|       <div class="text-1xl font-bold"> | ||||
|         ## implementation | ||||
|       </div> | ||||
|       <div class="text-1xl font-bold">## implementation</div> | ||||
|       <div class="text-gray-800 dark:text-gray-200 mt-4"> | ||||
|         Cook up appropriate Plutus validators to meet your needs | ||||
|       </div> | ||||
|     </div> | ||||
|     <div class="max-w-48"> | ||||
|       <div class="text-1xl font-bold"> | ||||
|         ## deployment | ||||
|       </div> | ||||
|       <div class="text-1xl font-bold">## deployment</div> | ||||
|       <div class="text-gray-800 dark:text-gray-200 mt-4"> | ||||
|         We facilitate integrating the on-chain aspects with the rest of your stack | ||||
|         We facilitate integrating the on-chain aspects with the rest of your | ||||
|         stack | ||||
|       </div> | ||||
|     </div> | ||||
|   </div> | ||||
|  |  | |||
|  | @ -3,55 +3,135 @@ | |||
|     <div class="relative flex h-16 items-center justify-between"> | ||||
|       <div class="absolute inset-y-0 left-0 flex items-center sm:hidden"> | ||||
|         <!-- Mobile menu button--> | ||||
|         <button type="button" class="inline-flex items-center justify-center rounded-md p-2 text-gray-400 hover:bg-gray-700 hover:text-white focus:outline-none focus:ring-2 focus:ring-inset focus:ring-white" aria-controls="mobile-menu" aria-expanded="false"> | ||||
|         <button | ||||
|           type="button" | ||||
|           class="inline-flex items-center justify-center rounded-md p-2 text-gray-400 hover:bg-gray-700 hover:text-white focus:outline-none focus:ring-2 focus:ring-inset focus:ring-white" | ||||
|           aria-controls="mobile-menu" | ||||
|           aria-expanded="false" | ||||
|         > | ||||
|           <span class="sr-only">Open main menu</span> | ||||
|           <!-- | ||||
|             Icon when menu is closed. | ||||
| 
 | ||||
|             Menu open: "hidden", Menu closed: "block" | ||||
|           --> | ||||
|           <svg class="block h-6 w-6" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" aria-hidden="true"> | ||||
|             <path stroke-linecap="round" stroke-linejoin="round" d="M3.75 6.75h16.5M3.75 12h16.5m-16.5 5.25h16.5" /> | ||||
|           <svg | ||||
|             class="block h-6 w-6" | ||||
|             fill="none" | ||||
|             viewBox="0 0 24 24" | ||||
|             stroke-width="1.5" | ||||
|             stroke="currentColor" | ||||
|             aria-hidden="true" | ||||
|           > | ||||
|             <path | ||||
|               stroke-linecap="round" | ||||
|               stroke-linejoin="round" | ||||
|               d="M3.75 6.75h16.5M3.75 12h16.5m-16.5 5.25h16.5" | ||||
|             /> | ||||
|           </svg> | ||||
|           <!-- | ||||
|             Icon when menu is open. | ||||
| 
 | ||||
|             Menu open: "block", Menu closed: "hidden" | ||||
|           --> | ||||
|           <svg class="hidden h-6 w-6" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" aria-hidden="true"> | ||||
|             <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12" /> | ||||
|           <svg | ||||
|             class="hidden h-6 w-6" | ||||
|             fill="none" | ||||
|             viewBox="0 0 24 24" | ||||
|             stroke-width="1.5" | ||||
|             stroke="currentColor" | ||||
|             aria-hidden="true" | ||||
|           > | ||||
|             <path | ||||
|               stroke-linecap="round" | ||||
|               stroke-linejoin="round" | ||||
|               d="M6 18L18 6M6 6l12 12" | ||||
|             /> | ||||
|           </svg> | ||||
|         </button> | ||||
|       </div> | ||||
|       <div class="flex flex-1 items-center justify-center sm:items-stretch sm:justify-start"> | ||||
|       <div | ||||
|         class="flex flex-1 items-center justify-center sm:items-stretch sm:justify-start" | ||||
|       > | ||||
|         <div class="flex flex-shrink-0 items-center"> | ||||
|           <img class="block h-8 w-auto lg:hidden" src="https://tailwindui.com/img/logos/mark.svg?color=indigo&shade=500" alt="Your Company"> | ||||
|           <img class="hidden h-8 w-auto lg:block" src="https://tailwindui.com/img/logos/mark.svg?color=indigo&shade=500" alt="Your Company"> | ||||
|           <img | ||||
|             class="block h-8 w-auto lg:hidden" | ||||
|             src="https://tailwindui.com/img/logos/mark.svg?color=indigo&shade=500" | ||||
|             alt="Your Company" | ||||
|           /> | ||||
|           <img | ||||
|             class="hidden h-8 w-auto lg:block" | ||||
|             src="https://tailwindui.com/img/logos/mark.svg?color=indigo&shade=500" | ||||
|             alt="Your Company" | ||||
|           /> | ||||
|         </div> | ||||
|         <div class="hidden sm:ml-6 sm:block"> | ||||
|           <div class="flex space-x-4"> | ||||
|             <!-- Current: "bg-gray-900 text-white", Default: "text-gray-300 hover:bg-gray-700 hover:text-white" --> | ||||
|             <a href="#" class="bg-gray-900 text-white rounded-md px-3 py-2 text-sm font-medium" aria-current="page">Dashboard</a> | ||||
|             <a href="#" class="text-gray-300 hover:bg-gray-700 hover:text-white rounded-md px-3 py-2 text-sm font-medium">Team</a> | ||||
|             <a href="#" class="text-gray-300 hover:bg-gray-700 hover:text-white rounded-md px-3 py-2 text-sm font-medium">Projects</a> | ||||
|             <a href="#" class="text-gray-300 hover:bg-gray-700 hover:text-white rounded-md px-3 py-2 text-sm font-medium">Calendar</a> | ||||
|             <a | ||||
|               href="#" | ||||
|               class="bg-gray-900 text-white rounded-md px-3 py-2 text-sm font-medium" | ||||
|               aria-current="page" | ||||
|               >Dashboard</a | ||||
|             > | ||||
|             <a | ||||
|               href="#" | ||||
|               class="text-gray-300 hover:bg-gray-700 hover:text-white rounded-md px-3 py-2 text-sm font-medium" | ||||
|               >Team</a | ||||
|             > | ||||
|             <a | ||||
|               href="#" | ||||
|               class="text-gray-300 hover:bg-gray-700 hover:text-white rounded-md px-3 py-2 text-sm font-medium" | ||||
|               >Projects</a | ||||
|             > | ||||
|             <a | ||||
|               href="#" | ||||
|               class="text-gray-300 hover:bg-gray-700 hover:text-white rounded-md px-3 py-2 text-sm font-medium" | ||||
|               >Calendar</a | ||||
|             > | ||||
|           </div> | ||||
|         </div> | ||||
|       </div> | ||||
|       <div class="absolute inset-y-0 right-0 flex items-center pr-2 sm:static sm:inset-auto sm:ml-6 sm:pr-0"> | ||||
|         <button type="button" class="rounded-full bg-gray-800 p-1 text-gray-400 hover:text-white focus:outline-none focus:ring-2 focus:ring-white focus:ring-offset-2 focus:ring-offset-gray-800"> | ||||
|       <div | ||||
|         class="absolute inset-y-0 right-0 flex items-center pr-2 sm:static sm:inset-auto sm:ml-6 sm:pr-0" | ||||
|       > | ||||
|         <button | ||||
|           type="button" | ||||
|           class="rounded-full bg-gray-800 p-1 text-gray-400 hover:text-white focus:outline-none focus:ring-2 focus:ring-white focus:ring-offset-2 focus:ring-offset-gray-800" | ||||
|         > | ||||
|           <span class="sr-only">View notifications</span> | ||||
|           <svg class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" aria-hidden="true"> | ||||
|             <path stroke-linecap="round" stroke-linejoin="round" d="M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75v-.7V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0" /> | ||||
|           <svg | ||||
|             class="h-6 w-6" | ||||
|             fill="none" | ||||
|             viewBox="0 0 24 24" | ||||
|             stroke-width="1.5" | ||||
|             stroke="currentColor" | ||||
|             aria-hidden="true" | ||||
|           > | ||||
|             <path | ||||
|               stroke-linecap="round" | ||||
|               stroke-linejoin="round" | ||||
|               d="M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75v-.7V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0" | ||||
|             /> | ||||
|           </svg> | ||||
|         </button> | ||||
| 
 | ||||
|         <!-- Profile dropdown --> | ||||
|         <div class="relative ml-3"> | ||||
|           <div> | ||||
|             <button type="button" class="flex rounded-full bg-gray-800 text-sm focus:outline-none focus:ring-2 focus:ring-white focus:ring-offset-2 focus:ring-offset-gray-800" id="user-menu-button" aria-expanded="false" aria-haspopup="true"> | ||||
|             <button | ||||
|               type="button" | ||||
|               class="flex rounded-full bg-gray-800 text-sm focus:outline-none focus:ring-2 focus:ring-white focus:ring-offset-2 focus:ring-offset-gray-800" | ||||
|               id="user-menu-button" | ||||
|               aria-expanded="false" | ||||
|               aria-haspopup="true" | ||||
|             > | ||||
|               <span class="sr-only">Open user menu</span> | ||||
|               <img class="h-8 w-8 rounded-full" src="https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=facearea&facepad=2&w=256&h=256&q=80" alt=""> | ||||
|               <img | ||||
|                 class="h-8 w-8 rounded-full" | ||||
|                 src="https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=facearea&facepad=2&w=256&h=256&q=80" | ||||
|                 alt="" | ||||
|               /> | ||||
|             </button> | ||||
|           </div> | ||||
| 
 | ||||
|  | @ -65,11 +145,38 @@ | |||
|               From: "transform opacity-100 scale-100" | ||||
|               To: "transform opacity-0 scale-95" | ||||
|           --> | ||||
|           <div class="absolute right-0 z-10 mt-2 w-48 origin-top-right rounded-md bg-white py-1 shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none" role="menu" aria-orientation="vertical" aria-labelledby="user-menu-button" tabindex="-1"> | ||||
|           <div | ||||
|             class="absolute right-0 z-10 mt-2 w-48 origin-top-right rounded-md bg-white py-1 shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none" | ||||
|             role="menu" | ||||
|             aria-orientation="vertical" | ||||
|             aria-labelledby="user-menu-button" | ||||
|             tabindex="-1" | ||||
|           > | ||||
|             <!-- Active: "bg-gray-100", Not Active: "" --> | ||||
|             <a href="#" class="block px-4 py-2 text-sm text-gray-700" role="menuitem" tabindex="-1" id="user-menu-item-0">Your Profile</a> | ||||
|             <a href="#" class="block px-4 py-2 text-sm text-gray-700" role="menuitem" tabindex="-1" id="user-menu-item-1">Settings</a> | ||||
|             <a href="#" class="block px-4 py-2 text-sm text-gray-700" role="menuitem" tabindex="-1" id="user-menu-item-2">Sign out</a> | ||||
|             <a | ||||
|               href="#" | ||||
|               class="block px-4 py-2 text-sm text-gray-700" | ||||
|               role="menuitem" | ||||
|               tabindex="-1" | ||||
|               id="user-menu-item-0" | ||||
|               >Your Profile</a | ||||
|             > | ||||
|             <a | ||||
|               href="#" | ||||
|               class="block px-4 py-2 text-sm text-gray-700" | ||||
|               role="menuitem" | ||||
|               tabindex="-1" | ||||
|               id="user-menu-item-1" | ||||
|               >Settings</a | ||||
|             > | ||||
|             <a | ||||
|               href="#" | ||||
|               class="block px-4 py-2 text-sm text-gray-700" | ||||
|               role="menuitem" | ||||
|               tabindex="-1" | ||||
|               id="user-menu-item-2" | ||||
|               >Sign out</a | ||||
|             > | ||||
|           </div> | ||||
|         </div> | ||||
|       </div> | ||||
|  | @ -80,10 +187,27 @@ | |||
|   <div class="sm:hidden" id="mobile-menu"> | ||||
|     <div class="space-y-1 px-2 pb-3 pt-2"> | ||||
|       <!-- Current: "bg-gray-900 text-white", Default: "text-gray-300 hover:bg-gray-700 hover:text-white" --> | ||||
|       <a href="#" class="bg-gray-900 text-white block rounded-md px-3 py-2 text-base font-medium" aria-current="page">Dashboard</a> | ||||
|       <a href="#" class="text-gray-300 hover:bg-gray-700 hover:text-white block rounded-md px-3 py-2 text-base font-medium">Team</a> | ||||
|       <a href="#" class="text-gray-300 hover:bg-gray-700 hover:text-white block rounded-md px-3 py-2 text-base font-medium">Projects</a> | ||||
|       <a href="#" class="text-gray-300 hover:bg-gray-700 hover:text-white block rounded-md px-3 py-2 text-base font-medium">Calendar</a> | ||||
|       <a | ||||
|         href="#" | ||||
|         class="bg-gray-900 text-white block rounded-md px-3 py-2 text-base font-medium" | ||||
|         aria-current="page" | ||||
|         >Dashboard</a | ||||
|       > | ||||
|       <a | ||||
|         href="#" | ||||
|         class="text-gray-300 hover:bg-gray-700 hover:text-white block rounded-md px-3 py-2 text-base font-medium" | ||||
|         >Team</a | ||||
|       > | ||||
|       <a | ||||
|         href="#" | ||||
|         class="text-gray-300 hover:bg-gray-700 hover:text-white block rounded-md px-3 py-2 text-base font-medium" | ||||
|         >Projects</a | ||||
|       > | ||||
|       <a | ||||
|         href="#" | ||||
|         class="text-gray-300 hover:bg-gray-700 hover:text-white block rounded-md px-3 py-2 text-base font-medium" | ||||
|         >Calendar</a | ||||
|       > | ||||
|     </div> | ||||
|   </div> | ||||
| </nav> | ||||
|  | @ -1,4 +1,4 @@ | |||
| <!DOCTYPE html> | ||||
| <!doctype html> | ||||
| <html lang="en-US"> | ||||
|   <head> | ||||
|     <meta charset="UTF-8" /> | ||||
|  | @ -12,13 +12,13 @@ | |||
|     /> | ||||
|     <meta name="theme-color" content="#ffffff" /> | ||||
|     <title>$title$</title> | ||||
|     <meta | ||||
|       name="description" | ||||
|       content="Lean dapp development" | ||||
|     <meta name="description" content="Lean dapp development" /> | ||||
|     <link rel="preconnect" href="https://fonts.googleapis.com" /> | ||||
|     <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin /> | ||||
|     <link | ||||
|       href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:ital,wght@0,300;0,400;0,700;1,300;1,400;1,700&display=swap" | ||||
|       rel="stylesheet" | ||||
|     /> | ||||
|     <link rel="preconnect" href="https://fonts.googleapis.com">  | ||||
|     <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> | ||||
|     <link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:ital,wght@0,300;0,400;0,700;1,300;1,400;1,700&display=swap" rel="stylesheet"> | ||||
|     <link rel="stylesheet" href="/css/normalize.css" /> | ||||
|     <link rel="stylesheet" href="/css/terminal.css" /> | ||||
|     <link rel="stylesheet" href="/css/custom.css" /> | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 waalge
						waalge